#pragma once

#include<string>
#include<cstdint>
#include<cstddef>
#include<stdexcept>

namespace GL
{
#ifndef APIENTRY
#  if defined(__MINGW32__) || defined(__CYGWIN__) || (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__)
#    define APIENTRY __stdcall
#  else
#    define APIENTRY
#  endif
#endif
#ifndef APIENTRYP
#define APIENTRYP APIENTRY*
#endif

	using Func_GetProcAddress = void*(APIENTRYP)(const char* symbol);
	using khronos_float_t = float;
	using khronos_ssize_t = ptrdiff_t;
	using khronos_intptr_t = ptrdiff_t;
	using khronos_int16_t = int16_t;
	using khronos_int8_t = int8_t;
	using khronos_uint8_t = uint8_t;
	using khronos_uint16_t = uint16_t;
	using khronos_int32_t = int32_t;
	using khronos_int64_t = int64_t;
	using khronos_uint64_t = uint64_t;

	class NullFuncPtrException : public std::runtime_error
	{
	public:
		NullFuncPtrException(std::string what) noexcept;
	};

	typedef void GLvoid;
	typedef unsigned int GLenum, GLbitfield, GLuint;
	typedef float GLfloat;
	typedef int GLint, GLsizei;
	typedef double GLdouble;
	typedef unsigned char GLboolean;
	typedef uint8_t GLubyte;
	typedef short GLshort;
	typedef int8_t GLbyte;
	typedef unsigned short GLushort;

	class Version10
	{
	protected:
		using PFNGLCULLFACEPROC = void (APIENTRYP) (GLenum mode);
		using PFNGLFRONTFACEPROC = void (APIENTRYP) (GLenum mode);
		using PFNGLHINTPROC = void (APIENTRYP) (GLenum target, GLenum mode);
		using PFNGLLINEWIDTHPROC = void (APIENTRYP) (GLfloat width);
		using PFNGLPOINTSIZEPROC = void (APIENTRYP) (GLfloat size);
		using PFNGLPOLYGONMODEPROC = void (APIENTRYP) (GLenum face, GLenum mode);
		using PFNGLSCISSORPROC = void (APIENTRYP) (GLint x, GLint y, GLsizei width, GLsizei height);
		using PFNGLTEXPARAMETERFPROC = void (APIENTRYP) (GLenum target, GLenum pname, GLfloat param);
		using PFNGLTEXPARAMETERFVPROC = void (APIENTRYP) (GLenum target, GLenum pname, const GLfloat* params);
		using PFNGLTEXPARAMETERIPROC = void (APIENTRYP) (GLenum target, GLenum pname, GLint param);
		using PFNGLTEXPARAMETERIVPROC = void (APIENTRYP) (GLenum target, GLenum pname, const GLint* params);
		using PFNGLTEXIMAGE1DPROC = void (APIENTRYP) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels);
		using PFNGLTEXIMAGE2DPROC = void (APIENTRYP) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);
		using PFNGLDRAWBUFFERPROC = void (APIENTRYP) (GLenum buf);
		using PFNGLCLEARPROC = void (APIENTRYP) (GLbitfield mask);
		using PFNGLCLEARCOLORPROC = void (APIENTRYP) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
		using PFNGLCLEARSTENCILPROC = void (APIENTRYP) (GLint s);
		using PFNGLCLEARDEPTHPROC = void (APIENTRYP) (GLdouble depth);
		using PFNGLSTENCILMASKPROC = void (APIENTRYP) (GLuint mask);
		using PFNGLCOLORMASKPROC = void (APIENTRYP) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
		using PFNGLDEPTHMASKPROC = void (APIENTRYP) (GLboolean flag);
		using PFNGLDISABLEPROC = void (APIENTRYP) (GLenum cap);
		using PFNGLENABLEPROC = void (APIENTRYP) (GLenum cap);
		using PFNGLFINISHPROC = void (APIENTRYP) (void);
		using PFNGLFLUSHPROC = void (APIENTRYP) (void);
		using PFNGLBLENDFUNCPROC = void (APIENTRYP) (GLenum sfactor, GLenum dfactor);
		using PFNGLLOGICOPPROC = void (APIENTRYP) (GLenum opcode);
		using PFNGLSTENCILFUNCPROC = void (APIENTRYP) (GLenum func, GLint ref, GLuint mask);
		using PFNGLSTENCILOPPROC = void (APIENTRYP) (GLenum fail, GLenum zfail, GLenum zpass);
		using PFNGLDEPTHFUNCPROC = void (APIENTRYP) (GLenum func);
		using PFNGLPIXELSTOREFPROC = void (APIENTRYP) (GLenum pname, GLfloat param);
		using PFNGLPIXELSTOREIPROC = void (APIENTRYP) (GLenum pname, GLint param);
		using PFNGLREADBUFFERPROC = void (APIENTRYP) (GLenum src);
		using PFNGLREADPIXELSPROC = void (APIENTRYP) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels);
		using PFNGLGETBOOLEANVPROC = void (APIENTRYP) (GLenum pname, GLboolean* data);
		using PFNGLGETDOUBLEVPROC = void (APIENTRYP) (GLenum pname, GLdouble* data);
		using PFNGLGETERRORPROC = GLenum (APIENTRYP) (void);
		using PFNGLGETFLOATVPROC = void (APIENTRYP) (GLenum pname, GLfloat* data);
		using PFNGLGETINTEGERVPROC = void (APIENTRYP) (GLenum pname, GLint* data);
		using PFNGLGETSTRINGPROC = const GLubyte* (APIENTRYP) (GLenum name);
		using PFNGLGETTEXIMAGEPROC = void (APIENTRYP) (GLenum target, GLint level, GLenum format, GLenum type, void* pixels);
		using PFNGLGETTEXPARAMETERFVPROC = void (APIENTRYP) (GLenum target, GLenum pname, GLfloat* params);
		using PFNGLGETTEXPARAMETERIVPROC = void (APIENTRYP) (GLenum target, GLenum pname, GLint* params);
		using PFNGLGETTEXLEVELPARAMETERFVPROC = void (APIENTRYP) (GLenum target, GLint level, GLenum pname, GLfloat* params);
		using PFNGLGETTEXLEVELPARAMETERIVPROC = void (APIENTRYP) (GLenum target, GLint level, GLenum pname, GLint* params);
		using PFNGLISENABLEDPROC = GLboolean (APIENTRYP) (GLenum cap);
		using PFNGLDEPTHRANGEPROC = void (APIENTRYP) (GLdouble n, GLdouble f);
		using PFNGLVIEWPORTPROC = void (APIENTRYP) (GLint x, GLint y, GLsizei width, GLsizei height);
		Func_GetProcAddress GetProcAddress;
		int Ver_Major;
		int Ver_Minor;
		int Ver_Release;
		std::string Vendor;
		std::string Renderer;
		std::string Version;

	private:
		bool Available;

	public:
		template<typename FuncType>
		FuncType GetProc(const char* symbol, FuncType DefaultBehaviorFunc)
		{
			void *ProcAddress = GetProcAddress(symbol);
			if (!ProcAddress)
			{
				return DefaultBehaviorFunc;
			}
			return reinterpret_cast<FuncType>(ProcAddress);
		}
		inline void GetVersion(int& Major, int& Minor, int& Release)
		{
			Major = Ver_Major;
			Minor = Ver_Minor;
			Release = Ver_Release;
		}
		inline std::string GetVendor() { return Vendor; }
		inline std::string GetRenderer() { return Renderer; }
		inline std::string GetVersion() { return Version; }
		Version10() = delete;
		Version10(Func_GetProcAddress GetProcAddress);
		inline bool Version10IsAvailable() { return Available; }

		static constexpr GLbitfield DEPTH_BUFFER_BIT = 0x00000100;
		static constexpr GLbitfield STENCIL_BUFFER_BIT = 0x00000400;
		static constexpr GLbitfield COLOR_BUFFER_BIT = 0x00004000;
		static constexpr GLenum FALSE = 0;
		static constexpr GLenum TRUE = 1;
		static constexpr GLenum POINTS = 0x0000;
		static constexpr GLenum LINES = 0x0001;
		static constexpr GLenum LINE_LOOP = 0x0002;
		static constexpr GLenum LINE_STRIP = 0x0003;
		static constexpr GLenum TRIANGLES = 0x0004;
		static constexpr GLenum TRIANGLE_STRIP = 0x0005;
		static constexpr GLenum TRIANGLE_FAN = 0x0006;
		static constexpr GLenum QUADS = 0x0007;
		static constexpr GLenum NEVER = 0x0200;
		static constexpr GLenum LESS = 0x0201;
		static constexpr GLenum EQUAL = 0x0202;
		static constexpr GLenum LEQUAL = 0x0203;
		static constexpr GLenum GREATER = 0x0204;
		static constexpr GLenum NOTEQUAL = 0x0205;
		static constexpr GLenum GEQUAL = 0x0206;
		static constexpr GLenum ALWAYS = 0x0207;
		static constexpr GLenum ZERO = 0;
		static constexpr GLenum ONE = 1;
		static constexpr GLenum SRC_COLOR = 0x0300;
		static constexpr GLenum ONE_MINUS_SRC_COLOR = 0x0301;
		static constexpr GLenum SRC_ALPHA = 0x0302;
		static constexpr GLenum ONE_MINUS_SRC_ALPHA = 0x0303;
		static constexpr GLenum DST_ALPHA = 0x0304;
		static constexpr GLenum ONE_MINUS_DST_ALPHA = 0x0305;
		static constexpr GLenum DST_COLOR = 0x0306;
		static constexpr GLenum ONE_MINUS_DST_COLOR = 0x0307;
		static constexpr GLenum SRC_ALPHA_SATURATE = 0x0308;
		static constexpr GLenum NONE = 0;
		static constexpr GLenum FRONT_LEFT = 0x0400;
		static constexpr GLenum FRONT_RIGHT = 0x0401;
		static constexpr GLenum BACK_LEFT = 0x0402;
		static constexpr GLenum BACK_RIGHT = 0x0403;
		static constexpr GLenum FRONT = 0x0404;
		static constexpr GLenum BACK = 0x0405;
		static constexpr GLenum LEFT = 0x0406;
		static constexpr GLenum RIGHT = 0x0407;
		static constexpr GLenum FRONT_AND_BACK = 0x0408;
		static constexpr GLenum NO_ERROR = 0;
		static constexpr GLenum INVALID_ENUM = 0x0500;
		static constexpr GLenum INVALID_VALUE = 0x0501;
		static constexpr GLenum INVALID_OPERATION = 0x0502;
		static constexpr GLenum OUT_OF_MEMORY = 0x0505;
		static constexpr GLenum CW = 0x0900;
		static constexpr GLenum CCW = 0x0901;
		static constexpr GLenum POINT_SIZE = 0x0B11;
		static constexpr GLenum POINT_SIZE_RANGE = 0x0B12;
		static constexpr GLenum POINT_SIZE_GRANULARITY = 0x0B13;
		static constexpr GLenum LINE_SMOOTH = 0x0B20;
		static constexpr GLenum LINE_WIDTH = 0x0B21;
		static constexpr GLenum LINE_WIDTH_RANGE = 0x0B22;
		static constexpr GLenum LINE_WIDTH_GRANULARITY = 0x0B23;
		static constexpr GLenum POLYGON_MODE = 0x0B40;
		static constexpr GLenum POLYGON_SMOOTH = 0x0B41;
		static constexpr GLenum CULL_FACE = 0x0B44;
		static constexpr GLenum CULL_FACE_MODE = 0x0B45;
		static constexpr GLenum FRONT_FACE = 0x0B46;
		static constexpr GLenum DEPTH_RANGE = 0x0B70;
		static constexpr GLenum DEPTH_TEST = 0x0B71;
		static constexpr GLenum DEPTH_WRITEMASK = 0x0B72;
		static constexpr GLenum DEPTH_CLEAR_VALUE = 0x0B73;
		static constexpr GLenum DEPTH_FUNC = 0x0B74;
		static constexpr GLenum STENCIL_TEST = 0x0B90;
		static constexpr GLenum STENCIL_CLEAR_VALUE = 0x0B91;
		static constexpr GLenum STENCIL_FUNC = 0x0B92;
		static constexpr GLenum STENCIL_VALUE_MASK = 0x0B93;
		static constexpr GLenum STENCIL_FAIL = 0x0B94;
		static constexpr GLenum STENCIL_PASS_DEPTH_FAIL = 0x0B95;
		static constexpr GLenum STENCIL_PASS_DEPTH_PASS = 0x0B96;
		static constexpr GLenum STENCIL_REF = 0x0B97;
		static constexpr GLenum STENCIL_WRITEMASK = 0x0B98;
		static constexpr GLenum VIEWPORT = 0x0BA2;
		static constexpr GLenum DITHER = 0x0BD0;
		static constexpr GLenum BLEND_DST = 0x0BE0;
		static constexpr GLenum BLEND_SRC = 0x0BE1;
		static constexpr GLenum BLEND = 0x0BE2;
		static constexpr GLenum LOGIC_OP_MODE = 0x0BF0;
		static constexpr GLenum DRAW_BUFFER = 0x0C01;
		static constexpr GLenum READ_BUFFER = 0x0C02;
		static constexpr GLenum SCISSOR_BOX = 0x0C10;
		static constexpr GLenum SCISSOR_TEST = 0x0C11;
		static constexpr GLenum COLOR_CLEAR_VALUE = 0x0C22;
		static constexpr GLenum COLOR_WRITEMASK = 0x0C23;
		static constexpr GLenum DOUBLEBUFFER = 0x0C32;
		static constexpr GLenum STEREO = 0x0C33;
		static constexpr GLenum LINE_SMOOTH_HINT = 0x0C52;
		static constexpr GLenum POLYGON_SMOOTH_HINT = 0x0C53;
		static constexpr GLenum UNPACK_SWAP_BYTES = 0x0CF0;
		static constexpr GLenum UNPACK_LSB_FIRST = 0x0CF1;
		static constexpr GLenum UNPACK_ROW_LENGTH = 0x0CF2;
		static constexpr GLenum UNPACK_SKIP_ROWS = 0x0CF3;
		static constexpr GLenum UNPACK_SKIP_PIXELS = 0x0CF4;
		static constexpr GLenum UNPACK_ALIGNMENT = 0x0CF5;
		static constexpr GLenum PACK_SWAP_BYTES = 0x0D00;
		static constexpr GLenum PACK_LSB_FIRST = 0x0D01;
		static constexpr GLenum PACK_ROW_LENGTH = 0x0D02;
		static constexpr GLenum PACK_SKIP_ROWS = 0x0D03;
		static constexpr GLenum PACK_SKIP_PIXELS = 0x0D04;
		static constexpr GLenum PACK_ALIGNMENT = 0x0D05;
		static constexpr GLenum MAX_TEXTURE_SIZE = 0x0D33;
		static constexpr GLenum MAX_VIEWPORT_DIMS = 0x0D3A;
		static constexpr GLenum SUBPIXEL_BITS = 0x0D50;
		static constexpr GLenum TEXTURE_1D = 0x0DE0;
		static constexpr GLenum TEXTURE_2D = 0x0DE1;
		static constexpr GLenum TEXTURE_WIDTH = 0x1000;
		static constexpr GLenum TEXTURE_HEIGHT = 0x1001;
		static constexpr GLenum TEXTURE_BORDER_COLOR = 0x1004;
		static constexpr GLenum DONT_CARE = 0x1100;
		static constexpr GLenum FASTEST = 0x1101;
		static constexpr GLenum NICEST = 0x1102;
		static constexpr GLenum BYTE = 0x1400;
		static constexpr GLenum UNSIGNED_BYTE = 0x1401;
		static constexpr GLenum SHORT = 0x1402;
		static constexpr GLenum UNSIGNED_SHORT = 0x1403;
		static constexpr GLenum INT = 0x1404;
		static constexpr GLenum UNSIGNED_INT = 0x1405;
		static constexpr GLenum FLOAT = 0x1406;
		static constexpr GLenum STACK_OVERFLOW = 0x0503;
		static constexpr GLenum STACK_UNDERFLOW = 0x0504;
		static constexpr GLenum CLEAR = 0x1500;
		static constexpr GLenum AND = 0x1501;
		static constexpr GLenum AND_REVERSE = 0x1502;
		static constexpr GLenum COPY = 0x1503;
		static constexpr GLenum AND_INVERTED = 0x1504;
		static constexpr GLenum NOOP = 0x1505;
		static constexpr GLenum XOR = 0x1506;
		static constexpr GLenum OR = 0x1507;
		static constexpr GLenum NOR = 0x1508;
		static constexpr GLenum EQUIV = 0x1509;
		static constexpr GLenum INVERT = 0x150A;
		static constexpr GLenum OR_REVERSE = 0x150B;
		static constexpr GLenum COPY_INVERTED = 0x150C;
		static constexpr GLenum OR_INVERTED = 0x150D;
		static constexpr GLenum NAND = 0x150E;
		static constexpr GLenum SET = 0x150F;
		static constexpr GLenum TEXTURE = 0x1702;
		static constexpr GLenum COLOR = 0x1800;
		static constexpr GLenum DEPTH = 0x1801;
		static constexpr GLenum STENCIL = 0x1802;
		static constexpr GLenum STENCIL_INDEX = 0x1901;
		static constexpr GLenum DEPTH_COMPONENT = 0x1902;
		static constexpr GLenum RED = 0x1903;
		static constexpr GLenum GREEN = 0x1904;
		static constexpr GLenum BLUE = 0x1905;
		static constexpr GLenum ALPHA = 0x1906;
		static constexpr GLenum RGB = 0x1907;
		static constexpr GLenum RGBA = 0x1908;
		static constexpr GLenum POINT = 0x1B00;
		static constexpr GLenum LINE = 0x1B01;
		static constexpr GLenum FILL = 0x1B02;
		static constexpr GLenum KEEP = 0x1E00;
		static constexpr GLenum REPLACE = 0x1E01;
		static constexpr GLenum INCR = 0x1E02;
		static constexpr GLenum DECR = 0x1E03;
		static constexpr GLenum VENDOR = 0x1F00;
		static constexpr GLenum RENDERER = 0x1F01;
		static constexpr GLenum VERSION = 0x1F02;
		static constexpr GLenum EXTENSIONS = 0x1F03;
		static constexpr GLint NEAREST = 0x2600;
		static constexpr GLint LINEAR = 0x2601;
		static constexpr GLint NEAREST_MIPMAP_NEAREST = 0x2700;
		static constexpr GLint LINEAR_MIPMAP_NEAREST = 0x2701;
		static constexpr GLint NEAREST_MIPMAP_LINEAR = 0x2702;
		static constexpr GLint LINEAR_MIPMAP_LINEAR = 0x2703;
		static constexpr GLenum TEXTURE_MAG_FILTER = 0x2800;
		static constexpr GLenum TEXTURE_MIN_FILTER = 0x2801;
		static constexpr GLenum TEXTURE_WRAP_S = 0x2802;
		static constexpr GLenum TEXTURE_WRAP_T = 0x2803;
		static constexpr GLint REPEAT = 0x2901;

		PFNGLCULLFACEPROC CullFace;
		PFNGLFRONTFACEPROC FrontFace;
		PFNGLHINTPROC Hint;
		PFNGLLINEWIDTHPROC LineWidth;
		PFNGLPOINTSIZEPROC PointSize;
		PFNGLPOLYGONMODEPROC PolygonMode;
		PFNGLSCISSORPROC Scissor;
		PFNGLTEXPARAMETERFPROC TexParameterf;
		PFNGLTEXPARAMETERFVPROC TexParameterfv;
		PFNGLTEXPARAMETERIPROC TexParameteri;
		PFNGLTEXPARAMETERIVPROC TexParameteriv;
		PFNGLTEXIMAGE1DPROC TexImage1D;
		PFNGLTEXIMAGE2DPROC TexImage2D;
		PFNGLDRAWBUFFERPROC DrawBuffer;
		PFNGLCLEARPROC Clear;
		PFNGLCLEARCOLORPROC ClearColor;
		PFNGLCLEARSTENCILPROC ClearStencil;
		PFNGLCLEARDEPTHPROC ClearDepth;
		PFNGLSTENCILMASKPROC StencilMask;
		PFNGLCOLORMASKPROC ColorMask;
		PFNGLDEPTHMASKPROC DepthMask;
		PFNGLDISABLEPROC Disable;
		PFNGLENABLEPROC Enable;
		PFNGLFINISHPROC Finish;
		PFNGLFLUSHPROC Flush;
		PFNGLBLENDFUNCPROC BlendFunc;
		PFNGLLOGICOPPROC LogicOp;
		PFNGLSTENCILFUNCPROC StencilFunc;
		PFNGLSTENCILOPPROC StencilOp;
		PFNGLDEPTHFUNCPROC DepthFunc;
		PFNGLPIXELSTOREFPROC PixelStoref;
		PFNGLPIXELSTOREIPROC PixelStorei;
		PFNGLREADBUFFERPROC ReadBuffer;
		PFNGLREADPIXELSPROC ReadPixels;
		PFNGLGETBOOLEANVPROC GetBooleanv;
		PFNGLGETDOUBLEVPROC GetDoublev;
		PFNGLGETERRORPROC GetError;
		PFNGLGETFLOATVPROC GetFloatv;
		PFNGLGETINTEGERVPROC GetIntegerv;
		PFNGLGETSTRINGPROC GetString;
		PFNGLGETTEXIMAGEPROC GetTexImage;
		PFNGLGETTEXPARAMETERFVPROC GetTexParameterfv;
		PFNGLGETTEXPARAMETERIVPROC GetTexParameteriv;
		PFNGLGETTEXLEVELPARAMETERFVPROC GetTexLevelParameterfv;
		PFNGLGETTEXLEVELPARAMETERIVPROC GetTexLevelParameteriv;
		PFNGLISENABLEDPROC IsEnabled;
		PFNGLDEPTHRANGEPROC DepthRange;
		PFNGLVIEWPORTPROC Viewport;

	};
	typedef khronos_float_t GLclampf;
	typedef double GLclampd;

	class Version11 : public Version10
	{
	protected:
		using PFNGLDRAWARRAYSPROC = void (APIENTRYP) (GLenum mode, GLint first, GLsizei count);
		using PFNGLDRAWELEMENTSPROC = void (APIENTRYP) (GLenum mode, GLsizei count, GLenum type, const void* indices);
		using PFNGLGETPOINTERVPROC = void (APIENTRYP) (GLenum pname, void** params);
		using PFNGLPOLYGONOFFSETPROC = void (APIENTRYP) (GLfloat factor, GLfloat units);
		using PFNGLCOPYTEXIMAGE1DPROC = void (APIENTRYP) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
		using PFNGLCOPYTEXIMAGE2DPROC = void (APIENTRYP) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
		using PFNGLCOPYTEXSUBIMAGE1DPROC = void (APIENTRYP) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
		using PFNGLCOPYTEXSUBIMAGE2DPROC = void (APIENTRYP) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
		using PFNGLTEXSUBIMAGE1DPROC = void (APIENTRYP) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels);
		using PFNGLTEXSUBIMAGE2DPROC = void (APIENTRYP) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);
		using PFNGLBINDTEXTUREPROC = void (APIENTRYP) (GLenum target, GLuint texture);
		using PFNGLDELETETEXTURESPROC = void (APIENTRYP) (GLsizei n, const GLuint* textures);
		using PFNGLGENTEXTURESPROC = void (APIENTRYP) (GLsizei n, GLuint* textures);
		using PFNGLISTEXTUREPROC = GLboolean (APIENTRYP) (GLuint texture);

	private:
		bool Available;

	public:
		Version11() = delete;
		Version11(Func_GetProcAddress GetProcAddress);
		inline bool Version11IsAvailable() { return Available; }

		static constexpr GLenum COLOR_LOGIC_OP = 0x0BF2;
		static constexpr GLenum POLYGON_OFFSET_UNITS = 0x2A00;
		static constexpr GLenum POLYGON_OFFSET_POINT = 0x2A01;
		static constexpr GLenum POLYGON_OFFSET_LINE = 0x2A02;
		static constexpr GLenum POLYGON_OFFSET_FILL = 0x8037;
		static constexpr GLenum POLYGON_OFFSET_FACTOR = 0x8038;
		static constexpr GLenum TEXTURE_BINDING_1D = 0x8068;
		static constexpr GLenum TEXTURE_BINDING_2D = 0x8069;
		static constexpr GLenum TEXTURE_INTERNAL_FORMAT = 0x1003;
		static constexpr GLenum TEXTURE_RED_SIZE = 0x805C;
		static constexpr GLenum TEXTURE_GREEN_SIZE = 0x805D;
		static constexpr GLenum TEXTURE_BLUE_SIZE = 0x805E;
		static constexpr GLenum TEXTURE_ALPHA_SIZE = 0x805F;
		static constexpr GLenum DOUBLE = 0x140A;
		static constexpr GLenum PROXY_TEXTURE_1D = 0x8063;
		static constexpr GLenum PROXY_TEXTURE_2D = 0x8064;
		static constexpr GLenum R3_G3_B2 = 0x2A10;
		static constexpr GLenum RGB4 = 0x804F;
		static constexpr GLenum RGB5 = 0x8050;
		static constexpr GLenum RGB8 = 0x8051;
		static constexpr GLenum RGB10 = 0x8052;
		static constexpr GLenum RGB12 = 0x8053;
		static constexpr GLenum RGB16 = 0x8054;
		static constexpr GLenum RGBA2 = 0x8055;
		static constexpr GLenum RGBA4 = 0x8056;
		static constexpr GLenum RGB5_A1 = 0x8057;
		static constexpr GLenum RGBA8 = 0x8058;
		static constexpr GLenum RGB10_A2 = 0x8059;
		static constexpr GLenum RGBA12 = 0x805A;
		static constexpr GLenum RGBA16 = 0x805B;
		static constexpr GLenum VERTEX_ARRAY = 0x8074;

		PFNGLDRAWARRAYSPROC DrawArrays;
		PFNGLDRAWELEMENTSPROC DrawElements;
		PFNGLGETPOINTERVPROC GetPointerv;
		PFNGLPOLYGONOFFSETPROC PolygonOffset;
		PFNGLCOPYTEXIMAGE1DPROC CopyTexImage1D;
		PFNGLCOPYTEXIMAGE2DPROC CopyTexImage2D;
		PFNGLCOPYTEXSUBIMAGE1DPROC CopyTexSubImage1D;
		PFNGLCOPYTEXSUBIMAGE2DPROC CopyTexSubImage2D;
		PFNGLTEXSUBIMAGE1DPROC TexSubImage1D;
		PFNGLTEXSUBIMAGE2DPROC TexSubImage2D;
		PFNGLBINDTEXTUREPROC BindTexture;
		PFNGLDELETETEXTURESPROC DeleteTextures;
		PFNGLGENTEXTURESPROC GenTextures;
		PFNGLISTEXTUREPROC IsTexture;

	};

	class Version12 : public Version11
	{
	protected:
		using PFNGLDRAWRANGEELEMENTSPROC = void (APIENTRYP) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices);
		using PFNGLTEXIMAGE3DPROC = void (APIENTRYP) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);
		using PFNGLTEXSUBIMAGE3DPROC = void (APIENTRYP) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);
		using PFNGLCOPYTEXSUBIMAGE3DPROC = void (APIENTRYP) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);

	private:
		bool Available;

	public:
		Version12() = delete;
		Version12(Func_GetProcAddress GetProcAddress);
		inline bool Version12IsAvailable() { return Available; }

		static constexpr GLenum UNSIGNED_BYTE_3_3_2 = 0x8032;
		static constexpr GLenum UNSIGNED_SHORT_4_4_4_4 = 0x8033;
		static constexpr GLenum UNSIGNED_SHORT_5_5_5_1 = 0x8034;
		static constexpr GLenum UNSIGNED_INT_8_8_8_8 = 0x8035;
		static constexpr GLenum UNSIGNED_INT_10_10_10_2 = 0x8036;
		static constexpr GLenum TEXTURE_BINDING_3D = 0x806A;
		static constexpr GLenum PACK_SKIP_IMAGES = 0x806B;
		static constexpr GLenum PACK_IMAGE_HEIGHT = 0x806C;
		static constexpr GLenum UNPACK_SKIP_IMAGES = 0x806D;
		static constexpr GLenum UNPACK_IMAGE_HEIGHT = 0x806E;
		static constexpr GLenum TEXTURE_3D = 0x806F;
		static constexpr GLenum PROXY_TEXTURE_3D = 0x8070;
		static constexpr GLenum TEXTURE_DEPTH = 0x8071;
		static constexpr GLenum TEXTURE_WRAP_R = 0x8072;
		static constexpr GLenum MAX_3D_TEXTURE_SIZE = 0x8073;
		static constexpr GLenum UNSIGNED_BYTE_2_3_3_REV = 0x8362;
		static constexpr GLenum UNSIGNED_SHORT_5_6_5 = 0x8363;
		static constexpr GLenum UNSIGNED_SHORT_5_6_5_REV = 0x8364;
		static constexpr GLenum UNSIGNED_SHORT_4_4_4_4_REV = 0x8365;
		static constexpr GLenum UNSIGNED_SHORT_1_5_5_5_REV = 0x8366;
		static constexpr GLenum UNSIGNED_INT_8_8_8_8_REV = 0x8367;
		static constexpr GLenum UNSIGNED_INT_2_10_10_10_REV = 0x8368;
		static constexpr GLenum BGR = 0x80E0;
		static constexpr GLenum BGRA = 0x80E1;
		static constexpr GLenum MAX_ELEMENTS_VERTICES = 0x80E8;
		static constexpr GLenum MAX_ELEMENTS_INDICES = 0x80E9;
		static constexpr GLint CLAMP_TO_EDGE = 0x812F;
		static constexpr GLenum TEXTURE_MIN_LOD = 0x813A;
		static constexpr GLenum TEXTURE_MAX_LOD = 0x813B;
		static constexpr GLenum TEXTURE_BASE_LEVEL = 0x813C;
		static constexpr GLenum TEXTURE_MAX_LEVEL = 0x813D;
		static constexpr GLenum SMOOTH_POINT_SIZE_RANGE = 0x0B12;
		static constexpr GLenum SMOOTH_POINT_SIZE_GRANULARITY = 0x0B13;
		static constexpr GLenum SMOOTH_LINE_WIDTH_RANGE = 0x0B22;
		static constexpr GLenum SMOOTH_LINE_WIDTH_GRANULARITY = 0x0B23;
		static constexpr GLenum ALIASED_LINE_WIDTH_RANGE = 0x846E;
		static constexpr GLenum RESCALE_NORMAL = 0x803A;
		static constexpr GLenum LIGHT_MODEL_COLOR_CONTROL = 0x81F8;
		static constexpr GLenum SINGLE_COLOR = 0x81F9;
		static constexpr GLenum SEPARATE_SPECULAR_COLOR = 0x81FA;
		static constexpr GLenum ALIASED_POINT_SIZE_RANGE = 0x846D;

		PFNGLDRAWRANGEELEMENTSPROC DrawRangeElements;
		PFNGLTEXIMAGE3DPROC TexImage3D;
		PFNGLTEXSUBIMAGE3DPROC TexSubImage3D;
		PFNGLCOPYTEXSUBIMAGE3DPROC CopyTexSubImage3D;

	};

	class Version13 : public Version12
	{
	protected:
		using PFNGLACTIVETEXTUREPROC = void (APIENTRYP) (GLenum texture);
		using PFNGLSAMPLECOVERAGEPROC = void (APIENTRYP) (GLfloat value, GLboolean invert);
		using PFNGLCOMPRESSEDTEXIMAGE3DPROC = void (APIENTRYP) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data);
		using PFNGLCOMPRESSEDTEXIMAGE2DPROC = void (APIENTRYP) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);
		using PFNGLCOMPRESSEDTEXIMAGE1DPROC = void (APIENTRYP) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data);
		using PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC = void (APIENTRYP) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);
		using PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC = void (APIENTRYP) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);
		using PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC = void (APIENTRYP) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data);
		using PFNGLGETCOMPRESSEDTEXIMAGEPROC = void (APIENTRYP) (GLenum target, GLint level, void* img);
		using PFNGLCLIENTACTIVETEXTUREPROC = void (APIENTRYP) (GLenum texture);
		using PFNGLMULTITEXCOORD1DPROC = void (APIENTRYP) (GLenum target, GLdouble s);
		using PFNGLMULTITEXCOORD1DVPROC = void (APIENTRYP) (GLenum target, const GLdouble* v);
		using PFNGLMULTITEXCOORD1FPROC = void (APIENTRYP) (GLenum target, GLfloat s);
		using PFNGLMULTITEXCOORD1FVPROC = void (APIENTRYP) (GLenum target, const GLfloat* v);
		using PFNGLMULTITEXCOORD1IPROC = void (APIENTRYP) (GLenum target, GLint s);
		using PFNGLMULTITEXCOORD1IVPROC = void (APIENTRYP) (GLenum target, const GLint* v);
		using PFNGLMULTITEXCOORD1SPROC = void (APIENTRYP) (GLenum target, GLshort s);
		using PFNGLMULTITEXCOORD1SVPROC = void (APIENTRYP) (GLenum target, const GLshort* v);
		using PFNGLMULTITEXCOORD2DPROC = void (APIENTRYP) (GLenum target, GLdouble s, GLdouble t);
		using PFNGLMULTITEXCOORD2DVPROC = void (APIENTRYP) (GLenum target, const GLdouble* v);
		using PFNGLMULTITEXCOORD2FPROC = void (APIENTRYP) (GLenum target, GLfloat s, GLfloat t);
		using PFNGLMULTITEXCOORD2FVPROC = void (APIENTRYP) (GLenum target, const GLfloat* v);
		using PFNGLMULTITEXCOORD2IPROC = void (APIENTRYP) (GLenum target, GLint s, GLint t);
		using PFNGLMULTITEXCOORD2IVPROC = void (APIENTRYP) (GLenum target, const GLint* v);
		using PFNGLMULTITEXCOORD2SPROC = void (APIENTRYP) (GLenum target, GLshort s, GLshort t);
		using PFNGLMULTITEXCOORD2SVPROC = void (APIENTRYP) (GLenum target, const GLshort* v);
		using PFNGLMULTITEXCOORD3DPROC = void (APIENTRYP) (GLenum target, GLdouble s, GLdouble t, GLdouble r);
		using PFNGLMULTITEXCOORD3DVPROC = void (APIENTRYP) (GLenum target, const GLdouble* v);
		using PFNGLMULTITEXCOORD3FPROC = void (APIENTRYP) (GLenum target, GLfloat s, GLfloat t, GLfloat r);
		using PFNGLMULTITEXCOORD3FVPROC = void (APIENTRYP) (GLenum target, const GLfloat* v);
		using PFNGLMULTITEXCOORD3IPROC = void (APIENTRYP) (GLenum target, GLint s, GLint t, GLint r);
		using PFNGLMULTITEXCOORD3IVPROC = void (APIENTRYP) (GLenum target, const GLint* v);
		using PFNGLMULTITEXCOORD3SPROC = void (APIENTRYP) (GLenum target, GLshort s, GLshort t, GLshort r);
		using PFNGLMULTITEXCOORD3SVPROC = void (APIENTRYP) (GLenum target, const GLshort* v);
		using PFNGLMULTITEXCOORD4DPROC = void (APIENTRYP) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
		using PFNGLMULTITEXCOORD4DVPROC = void (APIENTRYP) (GLenum target, const GLdouble* v);
		using PFNGLMULTITEXCOORD4FPROC = void (APIENTRYP) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
		using PFNGLMULTITEXCOORD4FVPROC = void (APIENTRYP) (GLenum target, const GLfloat* v);
		using PFNGLMULTITEXCOORD4IPROC = void (APIENTRYP) (GLenum target, GLint s, GLint t, GLint r, GLint q);
		using PFNGLMULTITEXCOORD4IVPROC = void (APIENTRYP) (GLenum target, const GLint* v);
		using PFNGLMULTITEXCOORD4SPROC = void (APIENTRYP) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
		using PFNGLMULTITEXCOORD4SVPROC = void (APIENTRYP) (GLenum target, const GLshort* v);
		using PFNGLLOADTRANSPOSEMATRIXFPROC = void (APIENTRYP) (const GLfloat* m);
		using PFNGLLOADTRANSPOSEMATRIXDPROC = void (APIENTRYP) (const GLdouble* m);
		using PFNGLMULTTRANSPOSEMATRIXFPROC = void (APIENTRYP) (const GLfloat* m);
		using PFNGLMULTTRANSPOSEMATRIXDPROC = void (APIENTRYP) (const GLdouble* m);

	private:
		bool Available;

	public:
		Version13() = delete;
		Version13(Func_GetProcAddress GetProcAddress);
		inline bool Version13IsAvailable() { return Available; }

		static constexpr GLenum TEXTURE0 = 0x84C0;
		static constexpr GLenum TEXTURE1 = 0x84C1;
		static constexpr GLenum TEXTURE2 = 0x84C2;
		static constexpr GLenum TEXTURE3 = 0x84C3;
		static constexpr GLenum TEXTURE4 = 0x84C4;
		static constexpr GLenum TEXTURE5 = 0x84C5;
		static constexpr GLenum TEXTURE6 = 0x84C6;
		static constexpr GLenum TEXTURE7 = 0x84C7;
		static constexpr GLenum TEXTURE8 = 0x84C8;
		static constexpr GLenum TEXTURE9 = 0x84C9;
		static constexpr GLenum TEXTURE10 = 0x84CA;
		static constexpr GLenum TEXTURE11 = 0x84CB;
		static constexpr GLenum TEXTURE12 = 0x84CC;
		static constexpr GLenum TEXTURE13 = 0x84CD;
		static constexpr GLenum TEXTURE14 = 0x84CE;
		static constexpr GLenum TEXTURE15 = 0x84CF;
		static constexpr GLenum TEXTURE16 = 0x84D0;
		static constexpr GLenum TEXTURE17 = 0x84D1;
		static constexpr GLenum TEXTURE18 = 0x84D2;
		static constexpr GLenum TEXTURE19 = 0x84D3;
		static constexpr GLenum TEXTURE20 = 0x84D4;
		static constexpr GLenum TEXTURE21 = 0x84D5;
		static constexpr GLenum TEXTURE22 = 0x84D6;
		static constexpr GLenum TEXTURE23 = 0x84D7;
		static constexpr GLenum TEXTURE24 = 0x84D8;
		static constexpr GLenum TEXTURE25 = 0x84D9;
		static constexpr GLenum TEXTURE26 = 0x84DA;
		static constexpr GLenum TEXTURE27 = 0x84DB;
		static constexpr GLenum TEXTURE28 = 0x84DC;
		static constexpr GLenum TEXTURE29 = 0x84DD;
		static constexpr GLenum TEXTURE30 = 0x84DE;
		static constexpr GLenum TEXTURE31 = 0x84DF;
		static constexpr GLenum ACTIVE_TEXTURE = 0x84E0;
		static constexpr GLenum MULTISAMPLE = 0x809D;
		static constexpr GLenum SAMPLE_ALPHA_TO_COVERAGE = 0x809E;
		static constexpr GLenum SAMPLE_ALPHA_TO_ONE = 0x809F;
		static constexpr GLenum SAMPLE_COVERAGE = 0x80A0;
		static constexpr GLenum SAMPLE_BUFFERS = 0x80A8;
		static constexpr GLenum SAMPLES = 0x80A9;
		static constexpr GLenum SAMPLE_COVERAGE_VALUE = 0x80AA;
		static constexpr GLenum SAMPLE_COVERAGE_INVERT = 0x80AB;
		static constexpr GLenum TEXTURE_CUBE_MAP = 0x8513;
		static constexpr GLenum TEXTURE_BINDING_CUBE_MAP = 0x8514;
		static constexpr GLenum TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;
		static constexpr GLenum TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;
		static constexpr GLenum TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;
		static constexpr GLenum TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;
		static constexpr GLenum TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;
		static constexpr GLenum TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;
		static constexpr GLenum PROXY_TEXTURE_CUBE_MAP = 0x851B;
		static constexpr GLenum MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;
		static constexpr GLenum COMPRESSED_RGB = 0x84ED;
		static constexpr GLenum COMPRESSED_RGBA = 0x84EE;
		static constexpr GLenum TEXTURE_COMPRESSION_HINT = 0x84EF;
		static constexpr GLenum TEXTURE_COMPRESSED_IMAGE_SIZE = 0x86A0;
		static constexpr GLenum TEXTURE_COMPRESSED = 0x86A1;
		static constexpr GLenum NUM_COMPRESSED_TEXTURE_FORMATS = 0x86A2;
		static constexpr GLenum COMPRESSED_TEXTURE_FORMATS = 0x86A3;
		static constexpr GLint CLAMP_TO_BORDER = 0x812D;
		static constexpr GLenum CLIENT_ACTIVE_TEXTURE = 0x84E1;
		static constexpr GLenum MAX_TEXTURE_UNITS = 0x84E2;
		static constexpr GLenum TRANSPOSE_MODELVIEW_MATRIX = 0x84E3;
		static constexpr GLenum TRANSPOSE_PROJECTION_MATRIX = 0x84E4;
		static constexpr GLenum TRANSPOSE_TEXTURE_MATRIX = 0x84E5;
		static constexpr GLenum TRANSPOSE_COLOR_MATRIX = 0x84E6;
		static constexpr GLbitfield MULTISAMPLE_BIT = 0x20000000;
		static constexpr GLenum NORMAL_MAP = 0x8511;
		static constexpr GLenum REFLECTION_MAP = 0x8512;
		static constexpr GLenum COMPRESSED_ALPHA = 0x84E9;
		static constexpr GLenum COMPRESSED_LUMINANCE = 0x84EA;
		static constexpr GLenum COMPRESSED_LUMINANCE_ALPHA = 0x84EB;
		static constexpr GLenum COMPRESSED_INTENSITY = 0x84EC;
		static constexpr GLenum COMBINE = 0x8570;
		static constexpr GLenum COMBINE_RGB = 0x8571;
		static constexpr GLenum COMBINE_ALPHA = 0x8572;
		static constexpr GLenum SOURCE0_RGB = 0x8580;
		static constexpr GLenum SOURCE1_RGB = 0x8581;
		static constexpr GLenum SOURCE2_RGB = 0x8582;
		static constexpr GLenum SOURCE0_ALPHA = 0x8588;
		static constexpr GLenum SOURCE1_ALPHA = 0x8589;
		static constexpr GLenum SOURCE2_ALPHA = 0x858A;
		static constexpr GLenum OPERAND0_RGB = 0x8590;
		static constexpr GLenum OPERAND1_RGB = 0x8591;
		static constexpr GLenum OPERAND2_RGB = 0x8592;
		static constexpr GLenum OPERAND0_ALPHA = 0x8598;
		static constexpr GLenum OPERAND1_ALPHA = 0x8599;
		static constexpr GLenum OPERAND2_ALPHA = 0x859A;
		static constexpr GLenum RGB_SCALE = 0x8573;
		static constexpr GLenum ADD_SIGNED = 0x8574;
		static constexpr GLenum INTERPOLATE = 0x8575;
		static constexpr GLenum SUBTRACT = 0x84E7;
		static constexpr GLenum CONSTANT = 0x8576;
		static constexpr GLenum PRIMARY_COLOR = 0x8577;
		static constexpr GLenum PREVIOUS = 0x8578;
		static constexpr GLenum DOT3_RGB = 0x86AE;
		static constexpr GLenum DOT3_RGBA = 0x86AF;

		PFNGLACTIVETEXTUREPROC ActiveTexture;
		PFNGLSAMPLECOVERAGEPROC SampleCoverage;
		PFNGLCOMPRESSEDTEXIMAGE3DPROC CompressedTexImage3D;
		PFNGLCOMPRESSEDTEXIMAGE2DPROC CompressedTexImage2D;
		PFNGLCOMPRESSEDTEXIMAGE1DPROC CompressedTexImage1D;
		PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC CompressedTexSubImage3D;
		PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC CompressedTexSubImage2D;
		PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC CompressedTexSubImage1D;
		PFNGLGETCOMPRESSEDTEXIMAGEPROC GetCompressedTexImage;
		PFNGLCLIENTACTIVETEXTUREPROC ClientActiveTexture;
		PFNGLMULTITEXCOORD1DPROC MultiTexCoord1d;
		PFNGLMULTITEXCOORD1DVPROC MultiTexCoord1dv;
		PFNGLMULTITEXCOORD1FPROC MultiTexCoord1f;
		PFNGLMULTITEXCOORD1FVPROC MultiTexCoord1fv;
		PFNGLMULTITEXCOORD1IPROC MultiTexCoord1i;
		PFNGLMULTITEXCOORD1IVPROC MultiTexCoord1iv;
		PFNGLMULTITEXCOORD1SPROC MultiTexCoord1s;
		PFNGLMULTITEXCOORD1SVPROC MultiTexCoord1sv;
		PFNGLMULTITEXCOORD2DPROC MultiTexCoord2d;
		PFNGLMULTITEXCOORD2DVPROC MultiTexCoord2dv;
		PFNGLMULTITEXCOORD2FPROC MultiTexCoord2f;
		PFNGLMULTITEXCOORD2FVPROC MultiTexCoord2fv;
		PFNGLMULTITEXCOORD2IPROC MultiTexCoord2i;
		PFNGLMULTITEXCOORD2IVPROC MultiTexCoord2iv;
		PFNGLMULTITEXCOORD2SPROC MultiTexCoord2s;
		PFNGLMULTITEXCOORD2SVPROC MultiTexCoord2sv;
		PFNGLMULTITEXCOORD3DPROC MultiTexCoord3d;
		PFNGLMULTITEXCOORD3DVPROC MultiTexCoord3dv;
		PFNGLMULTITEXCOORD3FPROC MultiTexCoord3f;
		PFNGLMULTITEXCOORD3FVPROC MultiTexCoord3fv;
		PFNGLMULTITEXCOORD3IPROC MultiTexCoord3i;
		PFNGLMULTITEXCOORD3IVPROC MultiTexCoord3iv;
		PFNGLMULTITEXCOORD3SPROC MultiTexCoord3s;
		PFNGLMULTITEXCOORD3SVPROC MultiTexCoord3sv;
		PFNGLMULTITEXCOORD4DPROC MultiTexCoord4d;
		PFNGLMULTITEXCOORD4DVPROC MultiTexCoord4dv;
		PFNGLMULTITEXCOORD4FPROC MultiTexCoord4f;
		PFNGLMULTITEXCOORD4FVPROC MultiTexCoord4fv;
		PFNGLMULTITEXCOORD4IPROC MultiTexCoord4i;
		PFNGLMULTITEXCOORD4IVPROC MultiTexCoord4iv;
		PFNGLMULTITEXCOORD4SPROC MultiTexCoord4s;
		PFNGLMULTITEXCOORD4SVPROC MultiTexCoord4sv;
		PFNGLLOADTRANSPOSEMATRIXFPROC LoadTransposeMatrixf;
		PFNGLLOADTRANSPOSEMATRIXDPROC LoadTransposeMatrixd;
		PFNGLMULTTRANSPOSEMATRIXFPROC MultTransposeMatrixf;
		PFNGLMULTTRANSPOSEMATRIXDPROC MultTransposeMatrixd;

	};

	class Version14 : public Version13
	{
	protected:
		using PFNGLBLENDFUNCSEPARATEPROC = void (APIENTRYP) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
		using PFNGLMULTIDRAWARRAYSPROC = void (APIENTRYP) (GLenum mode, const GLint* first, const GLsizei* count, GLsizei drawcount);
		using PFNGLMULTIDRAWELEMENTSPROC = void (APIENTRYP) (GLenum mode, const GLsizei* count, GLenum type, const void* const* indices, GLsizei drawcount);
		using PFNGLPOINTPARAMETERFPROC = void (APIENTRYP) (GLenum pname, GLfloat param);
		using PFNGLPOINTPARAMETERFVPROC = void (APIENTRYP) (GLenum pname, const GLfloat* params);
		using PFNGLPOINTPARAMETERIPROC = void (APIENTRYP) (GLenum pname, GLint param);
		using PFNGLPOINTPARAMETERIVPROC = void (APIENTRYP) (GLenum pname, const GLint* params);
		using PFNGLFOGCOORDFPROC = void (APIENTRYP) (GLfloat coord);
		using PFNGLFOGCOORDFVPROC = void (APIENTRYP) (const GLfloat* coord);
		using PFNGLFOGCOORDDPROC = void (APIENTRYP) (GLdouble coord);
		using PFNGLFOGCOORDDVPROC = void (APIENTRYP) (const GLdouble* coord);
		using PFNGLFOGCOORDPOINTERPROC = void (APIENTRYP) (GLenum type, GLsizei stride, const void* pointer);
		using PFNGLSECONDARYCOLOR3BPROC = void (APIENTRYP) (GLbyte red, GLbyte green, GLbyte blue);
		using PFNGLSECONDARYCOLOR3BVPROC = void (APIENTRYP) (const GLbyte* v);
		using PFNGLSECONDARYCOLOR3DPROC = void (APIENTRYP) (GLdouble red, GLdouble green, GLdouble blue);
		using PFNGLSECONDARYCOLOR3DVPROC = void (APIENTRYP) (const GLdouble* v);
		using PFNGLSECONDARYCOLOR3FPROC = void (APIENTRYP) (GLfloat red, GLfloat green, GLfloat blue);
		using PFNGLSECONDARYCOLOR3FVPROC = void (APIENTRYP) (const GLfloat* v);
		using PFNGLSECONDARYCOLOR3IPROC = void (APIENTRYP) (GLint red, GLint green, GLint blue);
		using PFNGLSECONDARYCOLOR3IVPROC = void (APIENTRYP) (const GLint* v);
		using PFNGLSECONDARYCOLOR3SPROC = void (APIENTRYP) (GLshort red, GLshort green, GLshort blue);
		using PFNGLSECONDARYCOLOR3SVPROC = void (APIENTRYP) (const GLshort* v);
		using PFNGLSECONDARYCOLOR3UBPROC = void (APIENTRYP) (GLubyte red, GLubyte green, GLubyte blue);
		using PFNGLSECONDARYCOLOR3UBVPROC = void (APIENTRYP) (const GLubyte* v);
		using PFNGLSECONDARYCOLOR3UIPROC = void (APIENTRYP) (GLuint red, GLuint green, GLuint blue);
		using PFNGLSECONDARYCOLOR3UIVPROC = void (APIENTRYP) (const GLuint* v);
		using PFNGLSECONDARYCOLOR3USPROC = void (APIENTRYP) (GLushort red, GLushort green, GLushort blue);
		using PFNGLSECONDARYCOLOR3USVPROC = void (APIENTRYP) (const GLushort* v);
		using PFNGLSECONDARYCOLORPOINTERPROC = void (APIENTRYP) (GLint size, GLenum type, GLsizei stride, const void* pointer);
		using PFNGLWINDOWPOS2DPROC = void (APIENTRYP) (GLdouble x, GLdouble y);
		using PFNGLWINDOWPOS2DVPROC = void (APIENTRYP) (const GLdouble* v);
		using PFNGLWINDOWPOS2FPROC = void (APIENTRYP) (GLfloat x, GLfloat y);
		using PFNGLWINDOWPOS2FVPROC = void (APIENTRYP) (const GLfloat* v);
		using PFNGLWINDOWPOS2IPROC = void (APIENTRYP) (GLint x, GLint y);
		using PFNGLWINDOWPOS2IVPROC = void (APIENTRYP) (const GLint* v);
		using PFNGLWINDOWPOS2SPROC = void (APIENTRYP) (GLshort x, GLshort y);
		using PFNGLWINDOWPOS2SVPROC = void (APIENTRYP) (const GLshort* v);
		using PFNGLWINDOWPOS3DPROC = void (APIENTRYP) (GLdouble x, GLdouble y, GLdouble z);
		using PFNGLWINDOWPOS3DVPROC = void (APIENTRYP) (const GLdouble* v);
		using PFNGLWINDOWPOS3FPROC = void (APIENTRYP) (GLfloat x, GLfloat y, GLfloat z);
		using PFNGLWINDOWPOS3FVPROC = void (APIENTRYP) (const GLfloat* v);
		using PFNGLWINDOWPOS3IPROC = void (APIENTRYP) (GLint x, GLint y, GLint z);
		using PFNGLWINDOWPOS3IVPROC = void (APIENTRYP) (const GLint* v);
		using PFNGLWINDOWPOS3SPROC = void (APIENTRYP) (GLshort x, GLshort y, GLshort z);
		using PFNGLWINDOWPOS3SVPROC = void (APIENTRYP) (const GLshort* v);
		using PFNGLBLENDCOLORPROC = void (APIENTRYP) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
		using PFNGLBLENDEQUATIONPROC = void (APIENTRYP) (GLenum mode);

	private:
		bool Available;

	public:
		Version14() = delete;
		Version14(Func_GetProcAddress GetProcAddress);
		inline bool Version14IsAvailable() { return Available; }

		static constexpr GLenum BLEND_DST_RGB = 0x80C8;
		static constexpr GLenum BLEND_SRC_RGB = 0x80C9;
		static constexpr GLenum BLEND_DST_ALPHA = 0x80CA;
		static constexpr GLenum BLEND_SRC_ALPHA = 0x80CB;
		static constexpr GLenum POINT_FADE_THRESHOLD_SIZE = 0x8128;
		static constexpr GLenum DEPTH_COMPONENT16 = 0x81A5;
		static constexpr GLenum DEPTH_COMPONENT24 = 0x81A6;
		static constexpr GLenum DEPTH_COMPONENT32 = 0x81A7;
		static constexpr GLint MIRRORED_REPEAT = 0x8370;
		static constexpr GLenum MAX_TEXTURE_LOD_BIAS = 0x84FD;
		static constexpr GLenum TEXTURE_LOD_BIAS = 0x8501;
		static constexpr GLenum INCR_WRAP = 0x8507;
		static constexpr GLenum DECR_WRAP = 0x8508;
		static constexpr GLenum TEXTURE_DEPTH_SIZE = 0x884A;
		static constexpr GLenum TEXTURE_COMPARE_MODE = 0x884C;
		static constexpr GLenum TEXTURE_COMPARE_FUNC = 0x884D;
		static constexpr GLenum POINT_SIZE_MIN = 0x8126;
		static constexpr GLenum POINT_SIZE_MAX = 0x8127;
		static constexpr GLenum POINT_DISTANCE_ATTENUATION = 0x8129;
		static constexpr GLenum GENERATE_MIPMAP = 0x8191;
		static constexpr GLenum GENERATE_MIPMAP_HINT = 0x8192;
		static constexpr GLenum FOG_COORDINATE_SOURCE = 0x8450;
		static constexpr GLenum FOG_COORDINATE = 0x8451;
		static constexpr GLenum FRAGMENT_DEPTH = 0x8452;
		static constexpr GLenum CURRENT_FOG_COORDINATE = 0x8453;
		static constexpr GLenum FOG_COORDINATE_ARRAY_TYPE = 0x8454;
		static constexpr GLenum FOG_COORDINATE_ARRAY_STRIDE = 0x8455;
		static constexpr GLenum FOG_COORDINATE_ARRAY_POINTER = 0x8456;
		static constexpr GLenum FOG_COORDINATE_ARRAY = 0x8457;
		static constexpr GLenum COLOR_SUM = 0x8458;
		static constexpr GLenum CURRENT_SECONDARY_COLOR = 0x8459;
		static constexpr GLenum SECONDARY_COLOR_ARRAY_SIZE = 0x845A;
		static constexpr GLenum SECONDARY_COLOR_ARRAY_TYPE = 0x845B;
		static constexpr GLenum SECONDARY_COLOR_ARRAY_STRIDE = 0x845C;
		static constexpr GLenum SECONDARY_COLOR_ARRAY_POINTER = 0x845D;
		static constexpr GLenum SECONDARY_COLOR_ARRAY = 0x845E;
		static constexpr GLenum TEXTURE_FILTER_CONTROL = 0x8500;
		static constexpr GLenum DEPTH_TEXTURE_MODE = 0x884B;
		static constexpr GLenum COMPARE_R_TO_TEXTURE = 0x884E;
		static constexpr GLenum BLEND_COLOR = 0x8005;
		static constexpr GLenum BLEND_EQUATION = 0x8009;
		static constexpr GLenum CONSTANT_COLOR = 0x8001;
		static constexpr GLenum ONE_MINUS_CONSTANT_COLOR = 0x8002;
		static constexpr GLenum CONSTANT_ALPHA = 0x8003;
		static constexpr GLenum ONE_MINUS_CONSTANT_ALPHA = 0x8004;
		static constexpr GLenum FUNC_ADD = 0x8006;
		static constexpr GLenum FUNC_REVERSE_SUBTRACT = 0x800B;
		static constexpr GLenum FUNC_SUBTRACT = 0x800A;
		static constexpr GLenum MIN = 0x8007;
		static constexpr GLenum MAX = 0x8008;

		PFNGLBLENDFUNCSEPARATEPROC BlendFuncSeparate;
		PFNGLMULTIDRAWARRAYSPROC MultiDrawArrays;
		PFNGLMULTIDRAWELEMENTSPROC MultiDrawElements;
		PFNGLPOINTPARAMETERFPROC PointParameterf;
		PFNGLPOINTPARAMETERFVPROC PointParameterfv;
		PFNGLPOINTPARAMETERIPROC PointParameteri;
		PFNGLPOINTPARAMETERIVPROC PointParameteriv;
		PFNGLFOGCOORDFPROC FogCoordf;
		PFNGLFOGCOORDFVPROC FogCoordfv;
		PFNGLFOGCOORDDPROC FogCoordd;
		PFNGLFOGCOORDDVPROC FogCoorddv;
		PFNGLFOGCOORDPOINTERPROC FogCoordPointer;
		PFNGLSECONDARYCOLOR3BPROC SecondaryColor3b;
		PFNGLSECONDARYCOLOR3BVPROC SecondaryColor3bv;
		PFNGLSECONDARYCOLOR3DPROC SecondaryColor3d;
		PFNGLSECONDARYCOLOR3DVPROC SecondaryColor3dv;
		PFNGLSECONDARYCOLOR3FPROC SecondaryColor3f;
		PFNGLSECONDARYCOLOR3FVPROC SecondaryColor3fv;
		PFNGLSECONDARYCOLOR3IPROC SecondaryColor3i;
		PFNGLSECONDARYCOLOR3IVPROC SecondaryColor3iv;
		PFNGLSECONDARYCOLOR3SPROC SecondaryColor3s;
		PFNGLSECONDARYCOLOR3SVPROC SecondaryColor3sv;
		PFNGLSECONDARYCOLOR3UBPROC SecondaryColor3ub;
		PFNGLSECONDARYCOLOR3UBVPROC SecondaryColor3ubv;
		PFNGLSECONDARYCOLOR3UIPROC SecondaryColor3ui;
		PFNGLSECONDARYCOLOR3UIVPROC SecondaryColor3uiv;
		PFNGLSECONDARYCOLOR3USPROC SecondaryColor3us;
		PFNGLSECONDARYCOLOR3USVPROC SecondaryColor3usv;
		PFNGLSECONDARYCOLORPOINTERPROC SecondaryColorPointer;
		PFNGLWINDOWPOS2DPROC WindowPos2d;
		PFNGLWINDOWPOS2DVPROC WindowPos2dv;
		PFNGLWINDOWPOS2FPROC WindowPos2f;
		PFNGLWINDOWPOS2FVPROC WindowPos2fv;
		PFNGLWINDOWPOS2IPROC WindowPos2i;
		PFNGLWINDOWPOS2IVPROC WindowPos2iv;
		PFNGLWINDOWPOS2SPROC WindowPos2s;
		PFNGLWINDOWPOS2SVPROC WindowPos2sv;
		PFNGLWINDOWPOS3DPROC WindowPos3d;
		PFNGLWINDOWPOS3DVPROC WindowPos3dv;
		PFNGLWINDOWPOS3FPROC WindowPos3f;
		PFNGLWINDOWPOS3FVPROC WindowPos3fv;
		PFNGLWINDOWPOS3IPROC WindowPos3i;
		PFNGLWINDOWPOS3IVPROC WindowPos3iv;
		PFNGLWINDOWPOS3SPROC WindowPos3s;
		PFNGLWINDOWPOS3SVPROC WindowPos3sv;
		PFNGLBLENDCOLORPROC BlendColor;
		PFNGLBLENDEQUATIONPROC BlendEquation;

	};
	typedef khronos_ssize_t GLsizeiptr;
	typedef khronos_intptr_t GLintptr;

	class Version15 : public Version14
	{
	protected:
		using PFNGLGENQUERIESPROC = void (APIENTRYP) (GLsizei n, GLuint* ids);
		using PFNGLDELETEQUERIESPROC = void (APIENTRYP) (GLsizei n, const GLuint* ids);
		using PFNGLISQUERYPROC = GLboolean (APIENTRYP) (GLuint id);
		using PFNGLBEGINQUERYPROC = void (APIENTRYP) (GLenum target, GLuint id);
		using PFNGLENDQUERYPROC = void (APIENTRYP) (GLenum target);
		using PFNGLGETQUERYIVPROC = void (APIENTRYP) (GLenum target, GLenum pname, GLint* params);
		using PFNGLGETQUERYOBJECTIVPROC = void (APIENTRYP) (GLuint id, GLenum pname, GLint* params);
		using PFNGLGETQUERYOBJECTUIVPROC = void (APIENTRYP) (GLuint id, GLenum pname, GLuint* params);
		using PFNGLBINDBUFFERPROC = void (APIENTRYP) (GLenum target, GLuint buffer);
		using PFNGLDELETEBUFFERSPROC = void (APIENTRYP) (GLsizei n, const GLuint* buffers);
		using PFNGLGENBUFFERSPROC = void (APIENTRYP) (GLsizei n, GLuint* buffers);
		using PFNGLISBUFFERPROC = GLboolean (APIENTRYP) (GLuint buffer);
		using PFNGLBUFFERDATAPROC = void (APIENTRYP) (GLenum target, GLsizeiptr size, const void* data, GLenum usage);
		using PFNGLBUFFERSUBDATAPROC = void (APIENTRYP) (GLenum target, GLintptr offset, GLsizeiptr size, const void* data);
		using PFNGLGETBUFFERSUBDATAPROC = void (APIENTRYP) (GLenum target, GLintptr offset, GLsizeiptr size, void* data);
		using PFNGLMAPBUFFERPROC = void* (APIENTRYP) (GLenum target, GLenum access);
		using PFNGLUNMAPBUFFERPROC = GLboolean (APIENTRYP) (GLenum target);
		using PFNGLGETBUFFERPARAMETERIVPROC = void (APIENTRYP) (GLenum target, GLenum pname, GLint* params);
		using PFNGLGETBUFFERPOINTERVPROC = void (APIENTRYP) (GLenum target, GLenum pname, void** params);

	private:
		bool Available;

	public:
		Version15() = delete;
		Version15(Func_GetProcAddress GetProcAddress);
		inline bool Version15IsAvailable() { return Available; }

		static constexpr GLenum BUFFER_SIZE = 0x8764;
		static constexpr GLenum BUFFER_USAGE = 0x8765;
		static constexpr GLenum QUERY_COUNTER_BITS = 0x8864;
		static constexpr GLenum CURRENT_QUERY = 0x8865;
		static constexpr GLenum QUERY_RESULT = 0x8866;
		static constexpr GLenum QUERY_RESULT_AVAILABLE = 0x8867;
		static constexpr GLenum ARRAY_BUFFER = 0x8892;
		static constexpr GLenum ELEMENT_ARRAY_BUFFER = 0x8893;
		static constexpr GLenum ARRAY_BUFFER_BINDING = 0x8894;
		static constexpr GLenum ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;
		static constexpr GLenum VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;
		static constexpr GLenum READ_ONLY = 0x88B8;
		static constexpr GLenum WRITE_ONLY = 0x88B9;
		static constexpr GLenum READ_WRITE = 0x88BA;
		static constexpr GLenum BUFFER_ACCESS = 0x88BB;
		static constexpr GLenum BUFFER_MAPPED = 0x88BC;
		static constexpr GLenum BUFFER_MAP_POINTER = 0x88BD;
		static constexpr GLenum STREAM_DRAW = 0x88E0;
		static constexpr GLenum STREAM_READ = 0x88E1;
		static constexpr GLenum STREAM_COPY = 0x88E2;
		static constexpr GLenum STATIC_DRAW = 0x88E4;
		static constexpr GLenum STATIC_READ = 0x88E5;
		static constexpr GLenum STATIC_COPY = 0x88E6;
		static constexpr GLenum DYNAMIC_DRAW = 0x88E8;
		static constexpr GLenum DYNAMIC_READ = 0x88E9;
		static constexpr GLenum DYNAMIC_COPY = 0x88EA;
		static constexpr GLenum SAMPLES_PASSED = 0x8914;
		static constexpr GLenum SRC1_ALPHA = 0x8589;
		static constexpr GLenum VERTEX_ARRAY_BUFFER_BINDING = 0x8896;
		static constexpr GLenum NORMAL_ARRAY_BUFFER_BINDING = 0x8897;
		static constexpr GLenum COLOR_ARRAY_BUFFER_BINDING = 0x8898;
		static constexpr GLenum INDEX_ARRAY_BUFFER_BINDING = 0x8899;
		static constexpr GLenum TEXTURE_COORD_ARRAY_BUFFER_BINDING = 0x889A;
		static constexpr GLenum EDGE_FLAG_ARRAY_BUFFER_BINDING = 0x889B;
		static constexpr GLenum SECONDARY_COLOR_ARRAY_BUFFER_BINDING = 0x889C;
		static constexpr GLenum FOG_COORDINATE_ARRAY_BUFFER_BINDING = 0x889D;
		static constexpr GLenum WEIGHT_ARRAY_BUFFER_BINDING = 0x889E;
		static constexpr GLenum FOG_COORD_SRC = 0x8450;
		static constexpr GLenum FOG_COORD = 0x8451;
		static constexpr GLenum CURRENT_FOG_COORD = 0x8453;
		static constexpr GLenum FOG_COORD_ARRAY_TYPE = 0x8454;
		static constexpr GLenum FOG_COORD_ARRAY_STRIDE = 0x8455;
		static constexpr GLenum FOG_COORD_ARRAY_POINTER = 0x8456;
		static constexpr GLenum FOG_COORD_ARRAY = 0x8457;
		static constexpr GLenum FOG_COORD_ARRAY_BUFFER_BINDING = 0x889D;
		static constexpr GLenum SRC0_RGB = 0x8580;
		static constexpr GLenum SRC1_RGB = 0x8581;
		static constexpr GLenum SRC2_RGB = 0x8582;
		static constexpr GLenum SRC0_ALPHA = 0x8588;
		static constexpr GLenum SRC2_ALPHA = 0x858A;

		PFNGLGENQUERIESPROC GenQueries;
		PFNGLDELETEQUERIESPROC DeleteQueries;
		PFNGLISQUERYPROC IsQuery;
		PFNGLBEGINQUERYPROC BeginQuery;
		PFNGLENDQUERYPROC EndQuery;
		PFNGLGETQUERYIVPROC GetQueryiv;
		PFNGLGETQUERYOBJECTIVPROC GetQueryObjectiv;
		PFNGLGETQUERYOBJECTUIVPROC GetQueryObjectuiv;
		PFNGLBINDBUFFERPROC BindBuffer;
		PFNGLDELETEBUFFERSPROC DeleteBuffers;
		PFNGLGENBUFFERSPROC GenBuffers;
		PFNGLISBUFFERPROC IsBuffer;
		PFNGLBUFFERDATAPROC BufferData;
		PFNGLBUFFERSUBDATAPROC BufferSubData;
		PFNGLGETBUFFERSUBDATAPROC GetBufferSubData;
		PFNGLMAPBUFFERPROC MapBuffer;
		PFNGLUNMAPBUFFERPROC UnmapBuffer;
		PFNGLGETBUFFERPARAMETERIVPROC GetBufferParameteriv;
		PFNGLGETBUFFERPOINTERVPROC GetBufferPointerv;

	};
	typedef char GLchar;

	class Version20 : public Version15
	{
	public:
		inline std::string GetShadingLanguageVersion() { return ShadingLanguageVersion; }
	protected:
		using PFNGLBLENDEQUATIONSEPARATEPROC = void (APIENTRYP) (GLenum modeRGB, GLenum modeAlpha);
		using PFNGLDRAWBUFFERSPROC = void (APIENTRYP) (GLsizei n, const GLenum* bufs);
		using PFNGLSTENCILOPSEPARATEPROC = void (APIENTRYP) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
		using PFNGLSTENCILFUNCSEPARATEPROC = void (APIENTRYP) (GLenum face, GLenum func, GLint ref, GLuint mask);
		using PFNGLSTENCILMASKSEPARATEPROC = void (APIENTRYP) (GLenum face, GLuint mask);
		using PFNGLATTACHSHADERPROC = void (APIENTRYP) (GLuint program, GLuint shader);
		using PFNGLBINDATTRIBLOCATIONPROC = void (APIENTRYP) (GLuint program, GLuint index, const GLchar* name);
		using PFNGLCOMPILESHADERPROC = void (APIENTRYP) (GLuint shader);
		using PFNGLCREATEPROGRAMPROC = GLuint (APIENTRYP) (void);
		using PFNGLCREATESHADERPROC = GLuint (APIENTRYP) (GLenum type);
		using PFNGLDELETEPROGRAMPROC = void (APIENTRYP) (GLuint program);
		using PFNGLDELETESHADERPROC = void (APIENTRYP) (GLuint shader);
		using PFNGLDETACHSHADERPROC = void (APIENTRYP) (GLuint program, GLuint shader);
		using PFNGLDISABLEVERTEXATTRIBARRAYPROC = void (APIENTRYP) (GLuint index);
		using PFNGLENABLEVERTEXATTRIBARRAYPROC = void (APIENTRYP) (GLuint index);
		using PFNGLGETACTIVEATTRIBPROC = void (APIENTRYP) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
		using PFNGLGETACTIVEUNIFORMPROC = void (APIENTRYP) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
		using PFNGLGETATTACHEDSHADERSPROC = void (APIENTRYP) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders);
		using PFNGLGETATTRIBLOCATIONPROC = GLint (APIENTRYP) (GLuint program, const GLchar* name);
		using PFNGLGETPROGRAMIVPROC = void (APIENTRYP) (GLuint program, GLenum pname, GLint* params);
		using PFNGLGETPROGRAMINFOLOGPROC = void (APIENTRYP) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog);
		using PFNGLGETSHADERIVPROC = void (APIENTRYP) (GLuint shader, GLenum pname, GLint* params);
		using PFNGLGETSHADERINFOLOGPROC = void (APIENTRYP) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog);
		using PFNGLGETSHADERSOURCEPROC = void (APIENTRYP) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* source);
		using PFNGLGETUNIFORMLOCATIONPROC = GLint (APIENTRYP) (GLuint program, const GLchar* name);
		using PFNGLGETUNIFORMFVPROC = void (APIENTRYP) (GLuint program, GLint location, GLfloat* params);
		using PFNGLGETUNIFORMIVPROC = void (APIENTRYP) (GLuint program, GLint location, GLint* params);
		using PFNGLGETVERTEXATTRIBDVPROC = void (APIENTRYP) (GLuint index, GLenum pname, GLdouble* params);
		using PFNGLGETVERTEXATTRIBFVPROC = void (APIENTRYP) (GLuint index, GLenum pname, GLfloat* params);
		using PFNGLGETVERTEXATTRIBIVPROC = void (APIENTRYP) (GLuint index, GLenum pname, GLint* params);
		using PFNGLGETVERTEXATTRIBPOINTERVPROC = void (APIENTRYP) (GLuint index, GLenum pname, void** pointer);
		using PFNGLISPROGRAMPROC = GLboolean (APIENTRYP) (GLuint program);
		using PFNGLISSHADERPROC = GLboolean (APIENTRYP) (GLuint shader);
		using PFNGLLINKPROGRAMPROC = void (APIENTRYP) (GLuint program);
		using PFNGLSHADERSOURCEPROC = void (APIENTRYP) (GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length);
		using PFNGLUSEPROGRAMPROC = void (APIENTRYP) (GLuint program);
		using PFNGLUNIFORM1FPROC = void (APIENTRYP) (GLint location, GLfloat v0);
		using PFNGLUNIFORM2FPROC = void (APIENTRYP) (GLint location, GLfloat v0, GLfloat v1);
		using PFNGLUNIFORM3FPROC = void (APIENTRYP) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
		using PFNGLUNIFORM4FPROC = void (APIENTRYP) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
		using PFNGLUNIFORM1IPROC = void (APIENTRYP) (GLint location, GLint v0);
		using PFNGLUNIFORM2IPROC = void (APIENTRYP) (GLint location, GLint v0, GLint v1);
		using PFNGLUNIFORM3IPROC = void (APIENTRYP) (GLint location, GLint v0, GLint v1, GLint v2);
		using PFNGLUNIFORM4IPROC = void (APIENTRYP) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
		using PFNGLUNIFORM1FVPROC = void (APIENTRYP) (GLint location, GLsizei count, const GLfloat* value);
		using PFNGLUNIFORM2FVPROC = void (APIENTRYP) (GLint location, GLsizei count, const GLfloat* value);
		using PFNGLUNIFORM3FVPROC = void (APIENTRYP) (GLint location, GLsizei count, const GLfloat* value);
		using PFNGLUNIFORM4FVPROC = void (APIENTRYP) (GLint location, GLsizei count, const GLfloat* value);
		using PFNGLUNIFORM1IVPROC = void (APIENTRYP) (GLint location, GLsizei count, const GLint* value);
		using PFNGLUNIFORM2IVPROC = void (APIENTRYP) (GLint location, GLsizei count, const GLint* value);
		using PFNGLUNIFORM3IVPROC = void (APIENTRYP) (GLint location, GLsizei count, const GLint* value);
		using PFNGLUNIFORM4IVPROC = void (APIENTRYP) (GLint location, GLsizei count, const GLint* value);
		using PFNGLUNIFORMMATRIX2FVPROC = void (APIENTRYP) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
		using PFNGLUNIFORMMATRIX3FVPROC = void (APIENTRYP) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
		using PFNGLUNIFORMMATRIX4FVPROC = void (APIENTRYP) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
		using PFNGLVALIDATEPROGRAMPROC = void (APIENTRYP) (GLuint program);
		using PFNGLVERTEXATTRIB1DPROC = void (APIENTRYP) (GLuint index, GLdouble x);
		using PFNGLVERTEXATTRIB1DVPROC = void (APIENTRYP) (GLuint index, const GLdouble* v);
		using PFNGLVERTEXATTRIB1FPROC = void (APIENTRYP) (GLuint index, GLfloat x);
		using PFNGLVERTEXATTRIB1FVPROC = void (APIENTRYP) (GLuint index, const GLfloat* v);
		using PFNGLVERTEXATTRIB1SPROC = void (APIENTRYP) (GLuint index, GLshort x);
		using PFNGLVERTEXATTRIB1SVPROC = void (APIENTRYP) (GLuint index, const GLshort* v);
		using PFNGLVERTEXATTRIB2DPROC = void (APIENTRYP) (GLuint index, GLdouble x, GLdouble y);
		using PFNGLVERTEXATTRIB2DVPROC = void (APIENTRYP) (GLuint index, const GLdouble* v);
		using PFNGLVERTEXATTRIB2FPROC = void (APIENTRYP) (GLuint index, GLfloat x, GLfloat y);
		using PFNGLVERTEXATTRIB2FVPROC = void (APIENTRYP) (GLuint index, const GLfloat* v);
		using PFNGLVERTEXATTRIB2SPROC = void (APIENTRYP) (GLuint index, GLshort x, GLshort y);
		using PFNGLVERTEXATTRIB2SVPROC = void (APIENTRYP) (GLuint index, const GLshort* v);
		using PFNGLVERTEXATTRIB3DPROC = void (APIENTRYP) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
		using PFNGLVERTEXATTRIB3DVPROC = void (APIENTRYP) (GLuint index, const GLdouble* v);
		using PFNGLVERTEXATTRIB3FPROC = void (APIENTRYP) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
		using PFNGLVERTEXATTRIB3FVPROC = void (APIENTRYP) (GLuint index, const GLfloat* v);
		using PFNGLVERTEXATTRIB3SPROC = void (APIENTRYP) (GLuint index, GLshort x, GLshort y, GLshort z);
		using PFNGLVERTEXATTRIB3SVPROC = void (APIENTRYP) (GLuint index, const GLshort* v);
		using PFNGLVERTEXATTRIB4NBVPROC = void (APIENTRYP) (GLuint index, const GLbyte* v);
		using PFNGLVERTEXATTRIB4NIVPROC = void (APIENTRYP) (GLuint index, const GLint* v);
		using PFNGLVERTEXATTRIB4NSVPROC = void (APIENTRYP) (GLuint index, const GLshort* v);
		using PFNGLVERTEXATTRIB4NUBPROC = void (APIENTRYP) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
		using PFNGLVERTEXATTRIB4NUBVPROC = void (APIENTRYP) (GLuint index, const GLubyte* v);
		using PFNGLVERTEXATTRIB4NUIVPROC = void (APIENTRYP) (GLuint index, const GLuint* v);
		using PFNGLVERTEXATTRIB4NUSVPROC = void (APIENTRYP) (GLuint index, const GLushort* v);
		using PFNGLVERTEXATTRIB4BVPROC = void (APIENTRYP) (GLuint index, const GLbyte* v);
		using PFNGLVERTEXATTRIB4DPROC = void (APIENTRYP) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
		using PFNGLVERTEXATTRIB4DVPROC = void (APIENTRYP) (GLuint index, const GLdouble* v);
		using PFNGLVERTEXATTRIB4FPROC = void (APIENTRYP) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
		using PFNGLVERTEXATTRIB4FVPROC = void (APIENTRYP) (GLuint index, const GLfloat* v);
		using PFNGLVERTEXATTRIB4IVPROC = void (APIENTRYP) (GLuint index, const GLint* v);
		using PFNGLVERTEXATTRIB4SPROC = void (APIENTRYP) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
		using PFNGLVERTEXATTRIB4SVPROC = void (APIENTRYP) (GLuint index, const GLshort* v);
		using PFNGLVERTEXATTRIB4UBVPROC = void (APIENTRYP) (GLuint index, const GLubyte* v);
		using PFNGLVERTEXATTRIB4UIVPROC = void (APIENTRYP) (GLuint index, const GLuint* v);
		using PFNGLVERTEXATTRIB4USVPROC = void (APIENTRYP) (GLuint index, const GLushort* v);
		using PFNGLVERTEXATTRIBPOINTERPROC = void (APIENTRYP) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer);
		std::string ShadingLanguageVersion;

	private:
		bool Available;

	public:
		Version20() = delete;
		Version20(Func_GetProcAddress GetProcAddress);
		inline bool Version20IsAvailable() { return Available; }

		static constexpr GLenum BLEND_EQUATION_RGB = 0x8009;
		static constexpr GLenum VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;
		static constexpr GLenum VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;
		static constexpr GLenum VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;
		static constexpr GLenum VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;
		static constexpr GLenum CURRENT_VERTEX_ATTRIB = 0x8626;
		static constexpr GLenum VERTEX_PROGRAM_POINT_SIZE = 0x8642;
		static constexpr GLenum VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;
		static constexpr GLenum STENCIL_BACK_FUNC = 0x8800;
		static constexpr GLenum STENCIL_BACK_FAIL = 0x8801;
		static constexpr GLenum STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;
		static constexpr GLenum STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;
		static constexpr GLenum MAX_DRAW_BUFFERS = 0x8824;
		static constexpr GLenum DRAW_BUFFER0 = 0x8825;
		static constexpr GLenum DRAW_BUFFER1 = 0x8826;
		static constexpr GLenum DRAW_BUFFER2 = 0x8827;
		static constexpr GLenum DRAW_BUFFER3 = 0x8828;
		static constexpr GLenum DRAW_BUFFER4 = 0x8829;
		static constexpr GLenum DRAW_BUFFER5 = 0x882A;
		static constexpr GLenum DRAW_BUFFER6 = 0x882B;
		static constexpr GLenum DRAW_BUFFER7 = 0x882C;
		static constexpr GLenum DRAW_BUFFER8 = 0x882D;
		static constexpr GLenum DRAW_BUFFER9 = 0x882E;
		static constexpr GLenum DRAW_BUFFER10 = 0x882F;
		static constexpr GLenum DRAW_BUFFER11 = 0x8830;
		static constexpr GLenum DRAW_BUFFER12 = 0x8831;
		static constexpr GLenum DRAW_BUFFER13 = 0x8832;
		static constexpr GLenum DRAW_BUFFER14 = 0x8833;
		static constexpr GLenum DRAW_BUFFER15 = 0x8834;
		static constexpr GLenum BLEND_EQUATION_ALPHA = 0x883D;
		static constexpr GLenum MAX_VERTEX_ATTRIBS = 0x8869;
		static constexpr GLenum VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;
		static constexpr GLenum MAX_TEXTURE_IMAGE_UNITS = 0x8872;
		static constexpr GLenum FRAGMENT_SHADER = 0x8B30;
		static constexpr GLenum VERTEX_SHADER = 0x8B31;
		static constexpr GLenum MAX_FRAGMENT_UNIFORM_COMPONENTS = 0x8B49;
		static constexpr GLenum MAX_VERTEX_UNIFORM_COMPONENTS = 0x8B4A;
		static constexpr GLenum MAX_VARYING_FLOATS = 0x8B4B;
		static constexpr GLenum MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;
		static constexpr GLenum MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;
		static constexpr GLenum SHADER_TYPE = 0x8B4F;
		static constexpr GLenum FLOAT_VEC2 = 0x8B50;
		static constexpr GLenum FLOAT_VEC3 = 0x8B51;
		static constexpr GLenum FLOAT_VEC4 = 0x8B52;
		static constexpr GLenum INT_VEC2 = 0x8B53;
		static constexpr GLenum INT_VEC3 = 0x8B54;
		static constexpr GLenum INT_VEC4 = 0x8B55;
		static constexpr GLenum BOOL = 0x8B56;
		static constexpr GLenum BOOL_VEC2 = 0x8B57;
		static constexpr GLenum BOOL_VEC3 = 0x8B58;
		static constexpr GLenum BOOL_VEC4 = 0x8B59;
		static constexpr GLenum FLOAT_MAT2 = 0x8B5A;
		static constexpr GLenum FLOAT_MAT3 = 0x8B5B;
		static constexpr GLenum FLOAT_MAT4 = 0x8B5C;
		static constexpr GLenum SAMPLER_1D = 0x8B5D;
		static constexpr GLenum SAMPLER_2D = 0x8B5E;
		static constexpr GLenum SAMPLER_3D = 0x8B5F;
		static constexpr GLenum SAMPLER_CUBE = 0x8B60;
		static constexpr GLenum SAMPLER_1D_SHADOW = 0x8B61;
		static constexpr GLenum SAMPLER_2D_SHADOW = 0x8B62;
		static constexpr GLenum DELETE_STATUS = 0x8B80;
		static constexpr GLenum COMPILE_STATUS = 0x8B81;
		static constexpr GLenum LINK_STATUS = 0x8B82;
		static constexpr GLenum VALIDATE_STATUS = 0x8B83;
		static constexpr GLenum INFO_LOG_LENGTH = 0x8B84;
		static constexpr GLenum ATTACHED_SHADERS = 0x8B85;
		static constexpr GLenum ACTIVE_UNIFORMS = 0x8B86;
		static constexpr GLenum ACTIVE_UNIFORM_MAX_LENGTH = 0x8B87;
		static constexpr GLenum SHADER_SOURCE_LENGTH = 0x8B88;
		static constexpr GLenum ACTIVE_ATTRIBUTES = 0x8B89;
		static constexpr GLenum ACTIVE_ATTRIBUTE_MAX_LENGTH = 0x8B8A;
		static constexpr GLenum FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8B8B;
		static constexpr GLenum SHADING_LANGUAGE_VERSION = 0x8B8C;
		static constexpr GLenum CURRENT_PROGRAM = 0x8B8D;
		static constexpr GLenum POINT_SPRITE_COORD_ORIGIN = 0x8CA0;
		static constexpr GLenum LOWER_LEFT = 0x8CA1;
		static constexpr GLenum UPPER_LEFT = 0x8CA2;
		static constexpr GLenum STENCIL_BACK_REF = 0x8CA3;
		static constexpr GLenum STENCIL_BACK_VALUE_MASK = 0x8CA4;
		static constexpr GLenum STENCIL_BACK_WRITEMASK = 0x8CA5;
		static constexpr GLenum VERTEX_PROGRAM_TWO_SIDE = 0x8643;
		static constexpr GLenum POINT_SPRITE = 0x8861;
		static constexpr GLenum COORD_REPLACE = 0x8862;
		static constexpr GLenum MAX_TEXTURE_COORDS = 0x8871;

		PFNGLBLENDEQUATIONSEPARATEPROC BlendEquationSeparate;
		PFNGLDRAWBUFFERSPROC DrawBuffers;
		PFNGLSTENCILOPSEPARATEPROC StencilOpSeparate;
		PFNGLSTENCILFUNCSEPARATEPROC StencilFuncSeparate;
		PFNGLSTENCILMASKSEPARATEPROC StencilMaskSeparate;
		PFNGLATTACHSHADERPROC AttachShader;
		PFNGLBINDATTRIBLOCATIONPROC BindAttribLocation;
		PFNGLCOMPILESHADERPROC CompileShader;
		PFNGLCREATEPROGRAMPROC CreateProgram;
		PFNGLCREATESHADERPROC CreateShader;
		PFNGLDELETEPROGRAMPROC DeleteProgram;
		PFNGLDELETESHADERPROC DeleteShader;
		PFNGLDETACHSHADERPROC DetachShader;
		PFNGLDISABLEVERTEXATTRIBARRAYPROC DisableVertexAttribArray;
		PFNGLENABLEVERTEXATTRIBARRAYPROC EnableVertexAttribArray;
		PFNGLGETACTIVEATTRIBPROC GetActiveAttrib;
		PFNGLGETACTIVEUNIFORMPROC GetActiveUniform;
		PFNGLGETATTACHEDSHADERSPROC GetAttachedShaders;
		PFNGLGETATTRIBLOCATIONPROC GetAttribLocation;
		PFNGLGETPROGRAMIVPROC GetProgramiv;
		PFNGLGETPROGRAMINFOLOGPROC GetProgramInfoLog;
		PFNGLGETSHADERIVPROC GetShaderiv;
		PFNGLGETSHADERINFOLOGPROC GetShaderInfoLog;
		PFNGLGETSHADERSOURCEPROC GetShaderSource;
		PFNGLGETUNIFORMLOCATIONPROC GetUniformLocation;
		PFNGLGETUNIFORMFVPROC GetUniformfv;
		PFNGLGETUNIFORMIVPROC GetUniformiv;
		PFNGLGETVERTEXATTRIBDVPROC GetVertexAttribdv;
		PFNGLGETVERTEXATTRIBFVPROC GetVertexAttribfv;
		PFNGLGETVERTEXATTRIBIVPROC GetVertexAttribiv;
		PFNGLGETVERTEXATTRIBPOINTERVPROC GetVertexAttribPointerv;
		PFNGLISPROGRAMPROC IsProgram;
		PFNGLISSHADERPROC IsShader;
		PFNGLLINKPROGRAMPROC LinkProgram;
		PFNGLSHADERSOURCEPROC ShaderSource;
		PFNGLUSEPROGRAMPROC UseProgram;
		PFNGLUNIFORM1FPROC Uniform1f;
		PFNGLUNIFORM2FPROC Uniform2f;
		PFNGLUNIFORM3FPROC Uniform3f;
		PFNGLUNIFORM4FPROC Uniform4f;
		PFNGLUNIFORM1IPROC Uniform1i;
		PFNGLUNIFORM2IPROC Uniform2i;
		PFNGLUNIFORM3IPROC Uniform3i;
		PFNGLUNIFORM4IPROC Uniform4i;
		PFNGLUNIFORM1FVPROC Uniform1fv;
		PFNGLUNIFORM2FVPROC Uniform2fv;
		PFNGLUNIFORM3FVPROC Uniform3fv;
		PFNGLUNIFORM4FVPROC Uniform4fv;
		PFNGLUNIFORM1IVPROC Uniform1iv;
		PFNGLUNIFORM2IVPROC Uniform2iv;
		PFNGLUNIFORM3IVPROC Uniform3iv;
		PFNGLUNIFORM4IVPROC Uniform4iv;
		PFNGLUNIFORMMATRIX2FVPROC UniformMatrix2fv;
		PFNGLUNIFORMMATRIX3FVPROC UniformMatrix3fv;
		PFNGLUNIFORMMATRIX4FVPROC UniformMatrix4fv;
		PFNGLVALIDATEPROGRAMPROC ValidateProgram;
		PFNGLVERTEXATTRIB1DPROC VertexAttrib1d;
		PFNGLVERTEXATTRIB1DVPROC VertexAttrib1dv;
		PFNGLVERTEXATTRIB1FPROC VertexAttrib1f;
		PFNGLVERTEXATTRIB1FVPROC VertexAttrib1fv;
		PFNGLVERTEXATTRIB1SPROC VertexAttrib1s;
		PFNGLVERTEXATTRIB1SVPROC VertexAttrib1sv;
		PFNGLVERTEXATTRIB2DPROC VertexAttrib2d;
		PFNGLVERTEXATTRIB2DVPROC VertexAttrib2dv;
		PFNGLVERTEXATTRIB2FPROC VertexAttrib2f;
		PFNGLVERTEXATTRIB2FVPROC VertexAttrib2fv;
		PFNGLVERTEXATTRIB2SPROC VertexAttrib2s;
		PFNGLVERTEXATTRIB2SVPROC VertexAttrib2sv;
		PFNGLVERTEXATTRIB3DPROC VertexAttrib3d;
		PFNGLVERTEXATTRIB3DVPROC VertexAttrib3dv;
		PFNGLVERTEXATTRIB3FPROC VertexAttrib3f;
		PFNGLVERTEXATTRIB3FVPROC VertexAttrib3fv;
		PFNGLVERTEXATTRIB3SPROC VertexAttrib3s;
		PFNGLVERTEXATTRIB3SVPROC VertexAttrib3sv;
		PFNGLVERTEXATTRIB4NBVPROC VertexAttrib4Nbv;
		PFNGLVERTEXATTRIB4NIVPROC VertexAttrib4Niv;
		PFNGLVERTEXATTRIB4NSVPROC VertexAttrib4Nsv;
		PFNGLVERTEXATTRIB4NUBPROC VertexAttrib4Nub;
		PFNGLVERTEXATTRIB4NUBVPROC VertexAttrib4Nubv;
		PFNGLVERTEXATTRIB4NUIVPROC VertexAttrib4Nuiv;
		PFNGLVERTEXATTRIB4NUSVPROC VertexAttrib4Nusv;
		PFNGLVERTEXATTRIB4BVPROC VertexAttrib4bv;
		PFNGLVERTEXATTRIB4DPROC VertexAttrib4d;
		PFNGLVERTEXATTRIB4DVPROC VertexAttrib4dv;
		PFNGLVERTEXATTRIB4FPROC VertexAttrib4f;
		PFNGLVERTEXATTRIB4FVPROC VertexAttrib4fv;
		PFNGLVERTEXATTRIB4IVPROC VertexAttrib4iv;
		PFNGLVERTEXATTRIB4SPROC VertexAttrib4s;
		PFNGLVERTEXATTRIB4SVPROC VertexAttrib4sv;
		PFNGLVERTEXATTRIB4UBVPROC VertexAttrib4ubv;
		PFNGLVERTEXATTRIB4UIVPROC VertexAttrib4uiv;
		PFNGLVERTEXATTRIB4USVPROC VertexAttrib4usv;
		PFNGLVERTEXATTRIBPOINTERPROC VertexAttribPointer;

		inline void Uniformf(GLint location, GLfloat v0) const { Uniform1f(location, v0);}
		inline void Uniformf(GLint location, GLfloat v0, GLfloat v1) const { Uniform2f(location, v0, v1);}
		inline void Uniformf(GLint location, GLfloat v0, GLfloat v1, GLfloat v2) const { Uniform3f(location, v0, v1, v2);}
		inline void Uniformf(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) const { Uniform4f(location, v0, v1, v2, v3);}
		inline void Uniformi(GLint location, GLint v0) const { Uniform1i(location, v0);}
		inline void Uniformi(GLint location, GLint v0, GLint v1) const { Uniform2i(location, v0, v1);}
		inline void Uniformi(GLint location, GLint v0, GLint v1, GLint v2) const { Uniform3i(location, v0, v1, v2);}
		inline void Uniformi(GLint location, GLint v0, GLint v1, GLint v2, GLint v3) const { Uniform4i(location, v0, v1, v2, v3);}
		inline void VertexAttribd(GLuint index, GLdouble x) const { VertexAttrib1d(index, x);}
		inline void VertexAttribf(GLuint index, GLfloat x) const { VertexAttrib1f(index, x);}
		inline void VertexAttribs(GLuint index, GLshort x) const { VertexAttrib1s(index, x);}
		inline void VertexAttribd(GLuint index, GLdouble x, GLdouble y) const { VertexAttrib2d(index, x, y);}
		inline void VertexAttribf(GLuint index, GLfloat x, GLfloat y) const { VertexAttrib2f(index, x, y);}
		inline void VertexAttribs(GLuint index, GLshort x, GLshort y) const { VertexAttrib2s(index, x, y);}
		inline void VertexAttribd(GLuint index, GLdouble x, GLdouble y, GLdouble z) const { VertexAttrib3d(index, x, y, z);}
		inline void VertexAttribf(GLuint index, GLfloat x, GLfloat y, GLfloat z) const { VertexAttrib3f(index, x, y, z);}
		inline void VertexAttribs(GLuint index, GLshort x, GLshort y, GLshort z) const { VertexAttrib3s(index, x, y, z);}
		inline void VertexAttribub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) const { VertexAttrib4Nub(index, x, y, z, w);}
		inline void VertexAttribd(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) const { VertexAttrib4d(index, x, y, z, w);}
		inline void VertexAttribf(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) const { VertexAttrib4f(index, x, y, z, w);}
		inline void VertexAttribs(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) const { VertexAttrib4s(index, x, y, z, w);}
	};

	class Version21 : public Version20
	{
	protected:
		using PFNGLUNIFORMMATRIX2X3FVPROC = void (APIENTRYP) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
		using PFNGLUNIFORMMATRIX3X2FVPROC = void (APIENTRYP) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
		using PFNGLUNIFORMMATRIX2X4FVPROC = void (APIENTRYP) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
		using PFNGLUNIFORMMATRIX4X2FVPROC = void (APIENTRYP) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
		using PFNGLUNIFORMMATRIX3X4FVPROC = void (APIENTRYP) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
		using PFNGLUNIFORMMATRIX4X3FVPROC = void (APIENTRYP) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);

	private:
		bool Available;

	public:
		Version21() = delete;
		Version21(Func_GetProcAddress GetProcAddress);
		inline bool Version21IsAvailable() { return Available; }

		static constexpr GLenum PIXEL_PACK_BUFFER = 0x88EB;
		static constexpr GLenum PIXEL_UNPACK_BUFFER = 0x88EC;
		static constexpr GLenum PIXEL_PACK_BUFFER_BINDING = 0x88ED;
		static constexpr GLenum PIXEL_UNPACK_BUFFER_BINDING = 0x88EF;
		static constexpr GLenum FLOAT_MAT2x3 = 0x8B65;
		static constexpr GLenum FLOAT_MAT2x4 = 0x8B66;
		static constexpr GLenum FLOAT_MAT3x2 = 0x8B67;
		static constexpr GLenum FLOAT_MAT3x4 = 0x8B68;
		static constexpr GLenum FLOAT_MAT4x2 = 0x8B69;
		static constexpr GLenum FLOAT_MAT4x3 = 0x8B6A;
		static constexpr GLenum SRGB = 0x8C40;
		static constexpr GLenum SRGB8 = 0x8C41;
		static constexpr GLenum SRGB_ALPHA = 0x8C42;
		static constexpr GLenum SRGB8_ALPHA8 = 0x8C43;
		static constexpr GLenum COMPRESSED_SRGB = 0x8C48;
		static constexpr GLenum COMPRESSED_SRGB_ALPHA = 0x8C49;
		static constexpr GLenum CURRENT_RASTER_SECONDARY_COLOR = 0x845F;
		static constexpr GLenum SLUMINANCE_ALPHA = 0x8C44;
		static constexpr GLenum SLUMINANCE8_ALPHA8 = 0x8C45;
		static constexpr GLenum SLUMINANCE = 0x8C46;
		static constexpr GLenum SLUMINANCE8 = 0x8C47;
		static constexpr GLenum COMPRESSED_SLUMINANCE = 0x8C4A;
		static constexpr GLenum COMPRESSED_SLUMINANCE_ALPHA = 0x8C4B;

		PFNGLUNIFORMMATRIX2X3FVPROC UniformMatrix2x3fv;
		PFNGLUNIFORMMATRIX3X2FVPROC UniformMatrix3x2fv;
		PFNGLUNIFORMMATRIX2X4FVPROC UniformMatrix2x4fv;
		PFNGLUNIFORMMATRIX4X2FVPROC UniformMatrix4x2fv;
		PFNGLUNIFORMMATRIX3X4FVPROC UniformMatrix3x4fv;
		PFNGLUNIFORMMATRIX4X3FVPROC UniformMatrix4x3fv;

	};
	typedef khronos_uint16_t GLhalf;

	class Version30 : public Version21
	{
	protected:
		using PFNGLCOLORMASKIPROC = void (APIENTRYP) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
		using PFNGLGETBOOLEANI_VPROC = void (APIENTRYP) (GLenum target, GLuint index, GLboolean* data);
		using PFNGLGETINTEGERI_VPROC = void (APIENTRYP) (GLenum target, GLuint index, GLint* data);
		using PFNGLENABLEIPROC = void (APIENTRYP) (GLenum target, GLuint index);
		using PFNGLDISABLEIPROC = void (APIENTRYP) (GLenum target, GLuint index);
		using PFNGLISENABLEDIPROC = GLboolean (APIENTRYP) (GLenum target, GLuint index);
		using PFNGLBEGINTRANSFORMFEEDBACKPROC = void (APIENTRYP) (GLenum primitiveMode);
		using PFNGLENDTRANSFORMFEEDBACKPROC = void (APIENTRYP) (void);
		using PFNGLBINDBUFFERRANGEPROC = void (APIENTRYP) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
		using PFNGLBINDBUFFERBASEPROC = void (APIENTRYP) (GLenum target, GLuint index, GLuint buffer);
		using PFNGLTRANSFORMFEEDBACKVARYINGSPROC = void (APIENTRYP) (GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode);
		using PFNGLGETTRANSFORMFEEDBACKVARYINGPROC = void (APIENTRYP) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name);
		using PFNGLCLAMPCOLORPROC = void (APIENTRYP) (GLenum target, GLenum clamp);
		using PFNGLBEGINCONDITIONALRENDERPROC = void (APIENTRYP) (GLuint id, GLenum mode);
		using PFNGLENDCONDITIONALRENDERPROC = void (APIENTRYP) (void);
		using PFNGLVERTEXATTRIBIPOINTERPROC = void (APIENTRYP) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer);
		using PFNGLGETVERTEXATTRIBIIVPROC = void (APIENTRYP) (GLuint index, GLenum pname, GLint* params);
		using PFNGLGETVERTEXATTRIBIUIVPROC = void (APIENTRYP) (GLuint index, GLenum pname, GLuint* params);
		using PFNGLVERTEXATTRIBI1IPROC = void (APIENTRYP) (GLuint index, GLint x);
		using PFNGLVERTEXATTRIBI2IPROC = void (APIENTRYP) (GLuint index, GLint x, GLint y);
		using PFNGLVERTEXATTRIBI3IPROC = void (APIENTRYP) (GLuint index, GLint x, GLint y, GLint z);
		using PFNGLVERTEXATTRIBI4IPROC = void (APIENTRYP) (GLuint index, GLint x, GLint y, GLint z, GLint w);
		using PFNGLVERTEXATTRIBI1UIPROC = void (APIENTRYP) (GLuint index, GLuint x);
		using PFNGLVERTEXATTRIBI2UIPROC = void (APIENTRYP) (GLuint index, GLuint x, GLuint y);
		using PFNGLVERTEXATTRIBI3UIPROC = void (APIENTRYP) (GLuint index, GLuint x, GLuint y, GLuint z);
		using PFNGLVERTEXATTRIBI4UIPROC = void (APIENTRYP) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
		using PFNGLVERTEXATTRIBI1IVPROC = void (APIENTRYP) (GLuint index, const GLint* v);
		using PFNGLVERTEXATTRIBI2IVPROC = void (APIENTRYP) (GLuint index, const GLint* v);
		using PFNGLVERTEXATTRIBI3IVPROC = void (APIENTRYP) (GLuint index, const GLint* v);
		using PFNGLVERTEXATTRIBI4IVPROC = void (APIENTRYP) (GLuint index, const GLint* v);
		using PFNGLVERTEXATTRIBI1UIVPROC = void (APIENTRYP) (GLuint index, const GLuint* v);
		using PFNGLVERTEXATTRIBI2UIVPROC = void (APIENTRYP) (GLuint index, const GLuint* v);
		using PFNGLVERTEXATTRIBI3UIVPROC = void (APIENTRYP) (GLuint index, const GLuint* v);
		using PFNGLVERTEXATTRIBI4UIVPROC = void (APIENTRYP) (GLuint index, const GLuint* v);
		using PFNGLVERTEXATTRIBI4BVPROC = void (APIENTRYP) (GLuint index, const GLbyte* v);
		using PFNGLVERTEXATTRIBI4SVPROC = void (APIENTRYP) (GLuint index, const GLshort* v);
		using PFNGLVERTEXATTRIBI4UBVPROC = void (APIENTRYP) (GLuint index, const GLubyte* v);
		using PFNGLVERTEXATTRIBI4USVPROC = void (APIENTRYP) (GLuint index, const GLushort* v);
		using PFNGLGETUNIFORMUIVPROC = void (APIENTRYP) (GLuint program, GLint location, GLuint* params);
		using PFNGLBINDFRAGDATALOCATIONPROC = void (APIENTRYP) (GLuint program, GLuint color, const GLchar* name);
		using PFNGLGETFRAGDATALOCATIONPROC = GLint (APIENTRYP) (GLuint program, const GLchar* name);
		using PFNGLUNIFORM1UIPROC = void (APIENTRYP) (GLint location, GLuint v0);
		using PFNGLUNIFORM2UIPROC = void (APIENTRYP) (GLint location, GLuint v0, GLuint v1);
		using PFNGLUNIFORM3UIPROC = void (APIENTRYP) (GLint location, GLuint v0, GLuint v1, GLuint v2);
		using PFNGLUNIFORM4UIPROC = void (APIENTRYP) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
		using PFNGLUNIFORM1UIVPROC = void (APIENTRYP) (GLint location, GLsizei count, const GLuint* value);
		using PFNGLUNIFORM2UIVPROC = void (APIENTRYP) (GLint location, GLsizei count, const GLuint* value);
		using PFNGLUNIFORM3UIVPROC = void (APIENTRYP) (GLint location, GLsizei count, const GLuint* value);
		using PFNGLUNIFORM4UIVPROC = void (APIENTRYP) (GLint location, GLsizei count, const GLuint* value);
		using PFNGLTEXPARAMETERIIVPROC = void (APIENTRYP) (GLenum target, GLenum pname, const GLint* params);
		using PFNGLTEXPARAMETERIUIVPROC = void (APIENTRYP) (GLenum target, GLenum pname, const GLuint* params);
		using PFNGLGETTEXPARAMETERIIVPROC = void (APIENTRYP) (GLenum target, GLenum pname, GLint* params);
		using PFNGLGETTEXPARAMETERIUIVPROC = void (APIENTRYP) (GLenum target, GLenum pname, GLuint* params);
		using PFNGLCLEARBUFFERIVPROC = void (APIENTRYP) (GLenum buffer, GLint drawbuffer, const GLint* value);
		using PFNGLCLEARBUFFERUIVPROC = void (APIENTRYP) (GLenum buffer, GLint drawbuffer, const GLuint* value);
		using PFNGLCLEARBUFFERFVPROC = void (APIENTRYP) (GLenum buffer, GLint drawbuffer, const GLfloat* value);
		using PFNGLCLEARBUFFERFIPROC = void (APIENTRYP) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
		using PFNGLGETSTRINGIPROC = const GLubyte* (APIENTRYP) (GLenum name, GLuint index);
		using PFNGLISRENDERBUFFERPROC = GLboolean (APIENTRYP) (GLuint renderbuffer);
		using PFNGLBINDRENDERBUFFERPROC = void (APIENTRYP) (GLenum target, GLuint renderbuffer);
		using PFNGLDELETERENDERBUFFERSPROC = void (APIENTRYP) (GLsizei n, const GLuint* renderbuffers);
		using PFNGLGENRENDERBUFFERSPROC = void (APIENTRYP) (GLsizei n, GLuint* renderbuffers);
		using PFNGLRENDERBUFFERSTORAGEPROC = void (APIENTRYP) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
		using PFNGLGETRENDERBUFFERPARAMETERIVPROC = void (APIENTRYP) (GLenum target, GLenum pname, GLint* params);
		using PFNGLISFRAMEBUFFERPROC = GLboolean (APIENTRYP) (GLuint framebuffer);
		using PFNGLBINDFRAMEBUFFERPROC = void (APIENTRYP) (GLenum target, GLuint framebuffer);
		using PFNGLDELETEFRAMEBUFFERSPROC = void (APIENTRYP) (GLsizei n, const GLuint* framebuffers);
		using PFNGLGENFRAMEBUFFERSPROC = void (APIENTRYP) (GLsizei n, GLuint* framebuffers);
		using PFNGLCHECKFRAMEBUFFERSTATUSPROC = GLenum (APIENTRYP) (GLenum target);
		using PFNGLFRAMEBUFFERTEXTURE1DPROC = void (APIENTRYP) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
		using PFNGLFRAMEBUFFERTEXTURE2DPROC = void (APIENTRYP) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
		using PFNGLFRAMEBUFFERTEXTURE3DPROC = void (APIENTRYP) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
		using PFNGLFRAMEBUFFERRENDERBUFFERPROC = void (APIENTRYP) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
		using PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC = void (APIENTRYP) (GLenum target, GLenum attachment, GLenum pname, GLint* params);
		using PFNGLGENERATEMIPMAPPROC = void (APIENTRYP) (GLenum target);
		using PFNGLBLITFRAMEBUFFERPROC = void (APIENTRYP) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
		using PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC = void (APIENTRYP) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
		using PFNGLFRAMEBUFFERTEXTURELAYERPROC = void (APIENTRYP) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
		using PFNGLMAPBUFFERRANGEPROC = void* (APIENTRYP) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
		using PFNGLFLUSHMAPPEDBUFFERRANGEPROC = void (APIENTRYP) (GLenum target, GLintptr offset, GLsizeiptr length);
		using PFNGLBINDVERTEXARRAYPROC = void (APIENTRYP) (GLuint array);
		using PFNGLDELETEVERTEXARRAYSPROC = void (APIENTRYP) (GLsizei n, const GLuint* arrays);
		using PFNGLGENVERTEXARRAYSPROC = void (APIENTRYP) (GLsizei n, GLuint* arrays);
		using PFNGLISVERTEXARRAYPROC = GLboolean (APIENTRYP) (GLuint array);

	private:
		bool Available;

	public:
		Version30() = delete;
		Version30(Func_GetProcAddress GetProcAddress);
		inline bool Version30IsAvailable() { return Available; }

		static constexpr GLenum COMPARE_REF_TO_TEXTURE = 0x884E;
		static constexpr GLenum CLIP_DISTANCE0 = 0x3000;
		static constexpr GLenum CLIP_DISTANCE1 = 0x3001;
		static constexpr GLenum CLIP_DISTANCE2 = 0x3002;
		static constexpr GLenum CLIP_DISTANCE3 = 0x3003;
		static constexpr GLenum CLIP_DISTANCE4 = 0x3004;
		static constexpr GLenum CLIP_DISTANCE5 = 0x3005;
		static constexpr GLenum CLIP_DISTANCE6 = 0x3006;
		static constexpr GLenum CLIP_DISTANCE7 = 0x3007;
		static constexpr GLenum MAX_CLIP_DISTANCES = 0x0D32;
		static constexpr GLenum MAJOR_VERSION = 0x821B;
		static constexpr GLenum MINOR_VERSION = 0x821C;
		static constexpr GLenum NUM_EXTENSIONS = 0x821D;
		static constexpr GLenum CONTEXT_FLAGS = 0x821E;
		static constexpr GLenum COMPRESSED_RED = 0x8225;
		static constexpr GLenum COMPRESSED_RG = 0x8226;
		static constexpr GLbitfield CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT = 0x00000001;
		static constexpr GLenum RGBA32F = 0x8814;
		static constexpr GLenum RGB32F = 0x8815;
		static constexpr GLenum RGBA16F = 0x881A;
		static constexpr GLenum RGB16F = 0x881B;
		static constexpr GLenum VERTEX_ATTRIB_ARRAY_INTEGER = 0x88FD;
		static constexpr GLenum MAX_ARRAY_TEXTURE_LAYERS = 0x88FF;
		static constexpr GLenum MIN_PROGRAM_TEXEL_OFFSET = 0x8904;
		static constexpr GLenum MAX_PROGRAM_TEXEL_OFFSET = 0x8905;
		static constexpr GLenum CLAMP_READ_COLOR = 0x891C;
		static constexpr GLenum FIXED_ONLY = 0x891D;
		static constexpr GLenum MAX_VARYING_COMPONENTS = 0x8B4B;
		static constexpr GLenum TEXTURE_1D_ARRAY = 0x8C18;
		static constexpr GLenum PROXY_TEXTURE_1D_ARRAY = 0x8C19;
		static constexpr GLenum TEXTURE_2D_ARRAY = 0x8C1A;
		static constexpr GLenum PROXY_TEXTURE_2D_ARRAY = 0x8C1B;
		static constexpr GLenum TEXTURE_BINDING_1D_ARRAY = 0x8C1C;
		static constexpr GLenum TEXTURE_BINDING_2D_ARRAY = 0x8C1D;
		static constexpr GLenum R11F_G11F_B10F = 0x8C3A;
		static constexpr GLenum UNSIGNED_INT_10F_11F_11F_REV = 0x8C3B;
		static constexpr GLenum RGB9_E5 = 0x8C3D;
		static constexpr GLenum UNSIGNED_INT_5_9_9_9_REV = 0x8C3E;
		static constexpr GLenum TEXTURE_SHARED_SIZE = 0x8C3F;
		static constexpr GLenum TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH = 0x8C76;
		static constexpr GLenum TRANSFORM_FEEDBACK_BUFFER_MODE = 0x8C7F;
		static constexpr GLenum MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 0x8C80;
		static constexpr GLenum TRANSFORM_FEEDBACK_VARYINGS = 0x8C83;
		static constexpr GLenum TRANSFORM_FEEDBACK_BUFFER_START = 0x8C84;
		static constexpr GLenum TRANSFORM_FEEDBACK_BUFFER_SIZE = 0x8C85;
		static constexpr GLenum PRIMITIVES_GENERATED = 0x8C87;
		static constexpr GLenum TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8C88;
		static constexpr GLenum RASTERIZER_DISCARD = 0x8C89;
		static constexpr GLenum MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8C8A;
		static constexpr GLenum MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 0x8C8B;
		static constexpr GLenum INTERLEAVED_ATTRIBS = 0x8C8C;
		static constexpr GLenum SEPARATE_ATTRIBS = 0x8C8D;
		static constexpr GLenum TRANSFORM_FEEDBACK_BUFFER = 0x8C8E;
		static constexpr GLenum TRANSFORM_FEEDBACK_BUFFER_BINDING = 0x8C8F;
		static constexpr GLenum RGBA32UI = 0x8D70;
		static constexpr GLenum RGB32UI = 0x8D71;
		static constexpr GLenum RGBA16UI = 0x8D76;
		static constexpr GLenum RGB16UI = 0x8D77;
		static constexpr GLenum RGBA8UI = 0x8D7C;
		static constexpr GLenum RGB8UI = 0x8D7D;
		static constexpr GLenum RGBA32I = 0x8D82;
		static constexpr GLenum RGB32I = 0x8D83;
		static constexpr GLenum RGBA16I = 0x8D88;
		static constexpr GLenum RGB16I = 0x8D89;
		static constexpr GLenum RGBA8I = 0x8D8E;
		static constexpr GLenum RGB8I = 0x8D8F;
		static constexpr GLenum RED_INTEGER = 0x8D94;
		static constexpr GLenum GREEN_INTEGER = 0x8D95;
		static constexpr GLenum BLUE_INTEGER = 0x8D96;
		static constexpr GLenum RGB_INTEGER = 0x8D98;
		static constexpr GLenum RGBA_INTEGER = 0x8D99;
		static constexpr GLenum BGR_INTEGER = 0x8D9A;
		static constexpr GLenum BGRA_INTEGER = 0x8D9B;
		static constexpr GLenum SAMPLER_1D_ARRAY = 0x8DC0;
		static constexpr GLenum SAMPLER_2D_ARRAY = 0x8DC1;
		static constexpr GLenum SAMPLER_1D_ARRAY_SHADOW = 0x8DC3;
		static constexpr GLenum SAMPLER_2D_ARRAY_SHADOW = 0x8DC4;
		static constexpr GLenum SAMPLER_CUBE_SHADOW = 0x8DC5;
		static constexpr GLenum UNSIGNED_INT_VEC2 = 0x8DC6;
		static constexpr GLenum UNSIGNED_INT_VEC3 = 0x8DC7;
		static constexpr GLenum UNSIGNED_INT_VEC4 = 0x8DC8;
		static constexpr GLenum INT_SAMPLER_1D = 0x8DC9;
		static constexpr GLenum INT_SAMPLER_2D = 0x8DCA;
		static constexpr GLenum INT_SAMPLER_3D = 0x8DCB;
		static constexpr GLenum INT_SAMPLER_CUBE = 0x8DCC;
		static constexpr GLenum INT_SAMPLER_1D_ARRAY = 0x8DCE;
		static constexpr GLenum INT_SAMPLER_2D_ARRAY = 0x8DCF;
		static constexpr GLenum UNSIGNED_INT_SAMPLER_1D = 0x8DD1;
		static constexpr GLenum UNSIGNED_INT_SAMPLER_2D = 0x8DD2;
		static constexpr GLenum UNSIGNED_INT_SAMPLER_3D = 0x8DD3;
		static constexpr GLenum UNSIGNED_INT_SAMPLER_CUBE = 0x8DD4;
		static constexpr GLenum UNSIGNED_INT_SAMPLER_1D_ARRAY = 0x8DD6;
		static constexpr GLenum UNSIGNED_INT_SAMPLER_2D_ARRAY = 0x8DD7;
		static constexpr GLenum QUERY_WAIT = 0x8E13;
		static constexpr GLenum QUERY_NO_WAIT = 0x8E14;
		static constexpr GLenum QUERY_BY_REGION_WAIT = 0x8E15;
		static constexpr GLenum QUERY_BY_REGION_NO_WAIT = 0x8E16;
		static constexpr GLenum BUFFER_ACCESS_FLAGS = 0x911F;
		static constexpr GLenum BUFFER_MAP_LENGTH = 0x9120;
		static constexpr GLenum BUFFER_MAP_OFFSET = 0x9121;
		static constexpr GLenum DEPTH_COMPONENT32F = 0x8CAC;
		static constexpr GLenum DEPTH32F_STENCIL8 = 0x8CAD;
		static constexpr GLenum FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD;
		static constexpr GLenum INVALID_FRAMEBUFFER_OPERATION = 0x0506;
		static constexpr GLenum FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210;
		static constexpr GLenum FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211;
		static constexpr GLenum FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212;
		static constexpr GLenum FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213;
		static constexpr GLenum FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214;
		static constexpr GLenum FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215;
		static constexpr GLenum FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216;
		static constexpr GLenum FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217;
		static constexpr GLenum FRAMEBUFFER_DEFAULT = 0x8218;
		static constexpr GLenum FRAMEBUFFER_UNDEFINED = 0x8219;
		static constexpr GLenum DEPTH_STENCIL_ATTACHMENT = 0x821A;
		static constexpr GLenum MAX_RENDERBUFFER_SIZE = 0x84E8;
		static constexpr GLenum DEPTH_STENCIL = 0x84F9;
		static constexpr GLenum UNSIGNED_INT_24_8 = 0x84FA;
		static constexpr GLenum DEPTH24_STENCIL8 = 0x88F0;
		static constexpr GLenum TEXTURE_STENCIL_SIZE = 0x88F1;
		static constexpr GLenum TEXTURE_RED_TYPE = 0x8C10;
		static constexpr GLenum TEXTURE_GREEN_TYPE = 0x8C11;
		static constexpr GLenum TEXTURE_BLUE_TYPE = 0x8C12;
		static constexpr GLenum TEXTURE_ALPHA_TYPE = 0x8C13;
		static constexpr GLenum TEXTURE_DEPTH_TYPE = 0x8C16;
		static constexpr GLenum UNSIGNED_NORMALIZED = 0x8C17;
		static constexpr GLenum FRAMEBUFFER_BINDING = 0x8CA6;
		static constexpr GLenum DRAW_FRAMEBUFFER_BINDING = 0x8CA6;
		static constexpr GLenum RENDERBUFFER_BINDING = 0x8CA7;
		static constexpr GLenum READ_FRAMEBUFFER = 0x8CA8;
		static constexpr GLenum DRAW_FRAMEBUFFER = 0x8CA9;
		static constexpr GLenum READ_FRAMEBUFFER_BINDING = 0x8CAA;
		static constexpr GLenum RENDERBUFFER_SAMPLES = 0x8CAB;
		static constexpr GLenum FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;
		static constexpr GLenum FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;
		static constexpr GLenum FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;
		static constexpr GLenum FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;
		static constexpr GLenum FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4;
		static constexpr GLenum FRAMEBUFFER_COMPLETE = 0x8CD5;
		static constexpr GLenum FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;
		static constexpr GLenum FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;
		static constexpr GLenum FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = 0x8CDB;
		static constexpr GLenum FRAMEBUFFER_INCOMPLETE_READ_BUFFER = 0x8CDC;
		static constexpr GLenum FRAMEBUFFER_UNSUPPORTED = 0x8CDD;
		static constexpr GLenum MAX_COLOR_ATTACHMENTS = 0x8CDF;
		static constexpr GLenum COLOR_ATTACHMENT0 = 0x8CE0;
		static constexpr GLenum COLOR_ATTACHMENT1 = 0x8CE1;
		static constexpr GLenum COLOR_ATTACHMENT2 = 0x8CE2;
		static constexpr GLenum COLOR_ATTACHMENT3 = 0x8CE3;
		static constexpr GLenum COLOR_ATTACHMENT4 = 0x8CE4;
		static constexpr GLenum COLOR_ATTACHMENT5 = 0x8CE5;
		static constexpr GLenum COLOR_ATTACHMENT6 = 0x8CE6;
		static constexpr GLenum COLOR_ATTACHMENT7 = 0x8CE7;
		static constexpr GLenum COLOR_ATTACHMENT8 = 0x8CE8;
		static constexpr GLenum COLOR_ATTACHMENT9 = 0x8CE9;
		static constexpr GLenum COLOR_ATTACHMENT10 = 0x8CEA;
		static constexpr GLenum COLOR_ATTACHMENT11 = 0x8CEB;
		static constexpr GLenum COLOR_ATTACHMENT12 = 0x8CEC;
		static constexpr GLenum COLOR_ATTACHMENT13 = 0x8CED;
		static constexpr GLenum COLOR_ATTACHMENT14 = 0x8CEE;
		static constexpr GLenum COLOR_ATTACHMENT15 = 0x8CEF;
		static constexpr GLenum COLOR_ATTACHMENT16 = 0x8CF0;
		static constexpr GLenum COLOR_ATTACHMENT17 = 0x8CF1;
		static constexpr GLenum COLOR_ATTACHMENT18 = 0x8CF2;
		static constexpr GLenum COLOR_ATTACHMENT19 = 0x8CF3;
		static constexpr GLenum COLOR_ATTACHMENT20 = 0x8CF4;
		static constexpr GLenum COLOR_ATTACHMENT21 = 0x8CF5;
		static constexpr GLenum COLOR_ATTACHMENT22 = 0x8CF6;
		static constexpr GLenum COLOR_ATTACHMENT23 = 0x8CF7;
		static constexpr GLenum COLOR_ATTACHMENT24 = 0x8CF8;
		static constexpr GLenum COLOR_ATTACHMENT25 = 0x8CF9;
		static constexpr GLenum COLOR_ATTACHMENT26 = 0x8CFA;
		static constexpr GLenum COLOR_ATTACHMENT27 = 0x8CFB;
		static constexpr GLenum COLOR_ATTACHMENT28 = 0x8CFC;
		static constexpr GLenum COLOR_ATTACHMENT29 = 0x8CFD;
		static constexpr GLenum COLOR_ATTACHMENT30 = 0x8CFE;
		static constexpr GLenum COLOR_ATTACHMENT31 = 0x8CFF;
		static constexpr GLenum DEPTH_ATTACHMENT = 0x8D00;
		static constexpr GLenum STENCIL_ATTACHMENT = 0x8D20;
		static constexpr GLenum FRAMEBUFFER = 0x8D40;
		static constexpr GLenum RENDERBUFFER = 0x8D41;
		static constexpr GLenum RENDERBUFFER_WIDTH = 0x8D42;
		static constexpr GLenum RENDERBUFFER_HEIGHT = 0x8D43;
		static constexpr GLenum RENDERBUFFER_INTERNAL_FORMAT = 0x8D44;
		static constexpr GLenum STENCIL_INDEX1 = 0x8D46;
		static constexpr GLenum STENCIL_INDEX4 = 0x8D47;
		static constexpr GLenum STENCIL_INDEX8 = 0x8D48;
		static constexpr GLenum STENCIL_INDEX16 = 0x8D49;
		static constexpr GLenum RENDERBUFFER_RED_SIZE = 0x8D50;
		static constexpr GLenum RENDERBUFFER_GREEN_SIZE = 0x8D51;
		static constexpr GLenum RENDERBUFFER_BLUE_SIZE = 0x8D52;
		static constexpr GLenum RENDERBUFFER_ALPHA_SIZE = 0x8D53;
		static constexpr GLenum RENDERBUFFER_DEPTH_SIZE = 0x8D54;
		static constexpr GLenum RENDERBUFFER_STENCIL_SIZE = 0x8D55;
		static constexpr GLenum FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8D56;
		static constexpr GLenum MAX_SAMPLES = 0x8D57;
		static constexpr GLenum INDEX = 0x8222;
		static constexpr GLenum TEXTURE_LUMINANCE_TYPE = 0x8C14;
		static constexpr GLenum TEXTURE_INTENSITY_TYPE = 0x8C15;
		static constexpr GLenum FRAMEBUFFER_SRGB = 0x8DB9;
		static constexpr GLenum HALF_FLOAT = 0x140B;
		static constexpr GLbitfield MAP_READ_BIT = 0x0001;
		static constexpr GLbitfield MAP_WRITE_BIT = 0x0002;
		static constexpr GLbitfield MAP_INVALIDATE_RANGE_BIT = 0x0004;
		static constexpr GLbitfield MAP_INVALIDATE_BUFFER_BIT = 0x0008;
		static constexpr GLbitfield MAP_FLUSH_EXPLICIT_BIT = 0x0010;
		static constexpr GLbitfield MAP_UNSYNCHRONIZED_BIT = 0x0020;
		static constexpr GLenum COMPRESSED_RED_RGTC1 = 0x8DBB;
		static constexpr GLenum COMPRESSED_SIGNED_RED_RGTC1 = 0x8DBC;
		static constexpr GLenum COMPRESSED_RG_RGTC2 = 0x8DBD;
		static constexpr GLenum COMPRESSED_SIGNED_RG_RGTC2 = 0x8DBE;
		static constexpr GLenum RG = 0x8227;
		static constexpr GLenum RG_INTEGER = 0x8228;
		static constexpr GLenum R8 = 0x8229;
		static constexpr GLenum R16 = 0x822A;
		static constexpr GLenum RG8 = 0x822B;
		static constexpr GLenum RG16 = 0x822C;
		static constexpr GLenum R16F = 0x822D;
		static constexpr GLenum R32F = 0x822E;
		static constexpr GLenum RG16F = 0x822F;
		static constexpr GLenum RG32F = 0x8230;
		static constexpr GLenum R8I = 0x8231;
		static constexpr GLenum R8UI = 0x8232;
		static constexpr GLenum R16I = 0x8233;
		static constexpr GLenum R16UI = 0x8234;
		static constexpr GLenum R32I = 0x8235;
		static constexpr GLenum R32UI = 0x8236;
		static constexpr GLenum RG8I = 0x8237;
		static constexpr GLenum RG8UI = 0x8238;
		static constexpr GLenum RG16I = 0x8239;
		static constexpr GLenum RG16UI = 0x823A;
		static constexpr GLenum RG32I = 0x823B;
		static constexpr GLenum RG32UI = 0x823C;
		static constexpr GLenum VERTEX_ARRAY_BINDING = 0x85B5;
		static constexpr GLenum CLAMP_VERTEX_COLOR = 0x891A;
		static constexpr GLenum CLAMP_FRAGMENT_COLOR = 0x891B;
		static constexpr GLenum ALPHA_INTEGER = 0x8D97;

		PFNGLCOLORMASKIPROC ColorMaski;
		PFNGLGETBOOLEANI_VPROC GetBooleani_v;
		PFNGLGETINTEGERI_VPROC GetIntegeri_v;
		PFNGLENABLEIPROC Enablei;
		PFNGLDISABLEIPROC Disablei;
		PFNGLISENABLEDIPROC IsEnabledi;
		PFNGLBEGINTRANSFORMFEEDBACKPROC BeginTransformFeedback;
		PFNGLENDTRANSFORMFEEDBACKPROC EndTransformFeedback;
		PFNGLBINDBUFFERRANGEPROC BindBufferRange;
		PFNGLBINDBUFFERBASEPROC BindBufferBase;
		PFNGLTRANSFORMFEEDBACKVARYINGSPROC TransformFeedbackVaryings;
		PFNGLGETTRANSFORMFEEDBACKVARYINGPROC GetTransformFeedbackVarying;
		PFNGLCLAMPCOLORPROC ClampColor;
		PFNGLBEGINCONDITIONALRENDERPROC BeginConditionalRender;
		PFNGLENDCONDITIONALRENDERPROC EndConditionalRender;
		PFNGLVERTEXATTRIBIPOINTERPROC VertexAttribIPointer;
		PFNGLGETVERTEXATTRIBIIVPROC GetVertexAttribIiv;
		PFNGLGETVERTEXATTRIBIUIVPROC GetVertexAttribIuiv;
		PFNGLVERTEXATTRIBI1IPROC VertexAttribI1i;
		PFNGLVERTEXATTRIBI2IPROC VertexAttribI2i;
		PFNGLVERTEXATTRIBI3IPROC VertexAttribI3i;
		PFNGLVERTEXATTRIBI4IPROC VertexAttribI4i;
		PFNGLVERTEXATTRIBI1UIPROC VertexAttribI1ui;
		PFNGLVERTEXATTRIBI2UIPROC VertexAttribI2ui;
		PFNGLVERTEXATTRIBI3UIPROC VertexAttribI3ui;
		PFNGLVERTEXATTRIBI4UIPROC VertexAttribI4ui;
		PFNGLVERTEXATTRIBI1IVPROC VertexAttribI1iv;
		PFNGLVERTEXATTRIBI2IVPROC VertexAttribI2iv;
		PFNGLVERTEXATTRIBI3IVPROC VertexAttribI3iv;
		PFNGLVERTEXATTRIBI4IVPROC VertexAttribI4iv;
		PFNGLVERTEXATTRIBI1UIVPROC VertexAttribI1uiv;
		PFNGLVERTEXATTRIBI2UIVPROC VertexAttribI2uiv;
		PFNGLVERTEXATTRIBI3UIVPROC VertexAttribI3uiv;
		PFNGLVERTEXATTRIBI4UIVPROC VertexAttribI4uiv;
		PFNGLVERTEXATTRIBI4BVPROC VertexAttribI4bv;
		PFNGLVERTEXATTRIBI4SVPROC VertexAttribI4sv;
		PFNGLVERTEXATTRIBI4UBVPROC VertexAttribI4ubv;
		PFNGLVERTEXATTRIBI4USVPROC VertexAttribI4usv;
		PFNGLGETUNIFORMUIVPROC GetUniformuiv;
		PFNGLBINDFRAGDATALOCATIONPROC BindFragDataLocation;
		PFNGLGETFRAGDATALOCATIONPROC GetFragDataLocation;
		PFNGLUNIFORM1UIPROC Uniform1ui;
		PFNGLUNIFORM2UIPROC Uniform2ui;
		PFNGLUNIFORM3UIPROC Uniform3ui;
		PFNGLUNIFORM4UIPROC Uniform4ui;
		PFNGLUNIFORM1UIVPROC Uniform1uiv;
		PFNGLUNIFORM2UIVPROC Uniform2uiv;
		PFNGLUNIFORM3UIVPROC Uniform3uiv;
		PFNGLUNIFORM4UIVPROC Uniform4uiv;
		PFNGLTEXPARAMETERIIVPROC TexParameterIiv;
		PFNGLTEXPARAMETERIUIVPROC TexParameterIuiv;
		PFNGLGETTEXPARAMETERIIVPROC GetTexParameterIiv;
		PFNGLGETTEXPARAMETERIUIVPROC GetTexParameterIuiv;
		PFNGLCLEARBUFFERIVPROC ClearBufferiv;
		PFNGLCLEARBUFFERUIVPROC ClearBufferuiv;
		PFNGLCLEARBUFFERFVPROC ClearBufferfv;
		PFNGLCLEARBUFFERFIPROC ClearBufferfi;
		PFNGLGETSTRINGIPROC GetStringi;
		PFNGLISRENDERBUFFERPROC IsRenderbuffer;
		PFNGLBINDRENDERBUFFERPROC BindRenderbuffer;
		PFNGLDELETERENDERBUFFERSPROC DeleteRenderbuffers;
		PFNGLGENRENDERBUFFERSPROC GenRenderbuffers;
		PFNGLRENDERBUFFERSTORAGEPROC RenderbufferStorage;
		PFNGLGETRENDERBUFFERPARAMETERIVPROC GetRenderbufferParameteriv;
		PFNGLISFRAMEBUFFERPROC IsFramebuffer;
		PFNGLBINDFRAMEBUFFERPROC BindFramebuffer;
		PFNGLDELETEFRAMEBUFFERSPROC DeleteFramebuffers;
		PFNGLGENFRAMEBUFFERSPROC GenFramebuffers;
		PFNGLCHECKFRAMEBUFFERSTATUSPROC CheckFramebufferStatus;
		PFNGLFRAMEBUFFERTEXTURE1DPROC FramebufferTexture1D;
		PFNGLFRAMEBUFFERTEXTURE2DPROC FramebufferTexture2D;
		PFNGLFRAMEBUFFERTEXTURE3DPROC FramebufferTexture3D;
		PFNGLFRAMEBUFFERRENDERBUFFERPROC FramebufferRenderbuffer;
		PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC GetFramebufferAttachmentParameteriv;
		PFNGLGENERATEMIPMAPPROC GenerateMipmap;
		PFNGLBLITFRAMEBUFFERPROC BlitFramebuffer;
		PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC RenderbufferStorageMultisample;
		PFNGLFRAMEBUFFERTEXTURELAYERPROC FramebufferTextureLayer;
		PFNGLMAPBUFFERRANGEPROC MapBufferRange;
		PFNGLFLUSHMAPPEDBUFFERRANGEPROC FlushMappedBufferRange;
		PFNGLBINDVERTEXARRAYPROC BindVertexArray;
		PFNGLDELETEVERTEXARRAYSPROC DeleteVertexArrays;
		PFNGLGENVERTEXARRAYSPROC GenVertexArrays;
		PFNGLISVERTEXARRAYPROC IsVertexArray;

		inline void VertexAttribIi(GLuint index, GLint x) const { VertexAttribI1i(index, x);}
		inline void VertexAttribIi(GLuint index, GLint x, GLint y) const { VertexAttribI2i(index, x, y);}
		inline void VertexAttribIi(GLuint index, GLint x, GLint y, GLint z) const { VertexAttribI3i(index, x, y, z);}
		inline void VertexAttribIi(GLuint index, GLint x, GLint y, GLint z, GLint w) const { VertexAttribI4i(index, x, y, z, w);}
		inline void VertexAttribIui(GLuint index, GLuint x) const { VertexAttribI1ui(index, x);}
		inline void VertexAttribIui(GLuint index, GLuint x, GLuint y) const { VertexAttribI2ui(index, x, y);}
		inline void VertexAttribIui(GLuint index, GLuint x, GLuint y, GLuint z) const { VertexAttribI3ui(index, x, y, z);}
		inline void VertexAttribIui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) const { VertexAttribI4ui(index, x, y, z, w);}
		inline void Uniformui(GLint location, GLuint v0) const { Uniform1ui(location, v0);}
		inline void Uniformui(GLint location, GLuint v0, GLuint v1) const { Uniform2ui(location, v0, v1);}
		inline void Uniformui(GLint location, GLuint v0, GLuint v1, GLuint v2) const { Uniform3ui(location, v0, v1, v2);}
		inline void Uniformui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) const { Uniform4ui(location, v0, v1, v2, v3);}
	};

	class Version31 : public Version30
	{
	protected:
		using PFNGLDRAWARRAYSINSTANCEDPROC = void (APIENTRYP) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
		using PFNGLDRAWELEMENTSINSTANCEDPROC = void (APIENTRYP) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount);
		using PFNGLTEXBUFFERPROC = void (APIENTRYP) (GLenum target, GLenum internalformat, GLuint buffer);
		using PFNGLPRIMITIVERESTARTINDEXPROC = void (APIENTRYP) (GLuint index);
		using PFNGLCOPYBUFFERSUBDATAPROC = void (APIENTRYP) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
		using PFNGLGETUNIFORMINDICESPROC = void (APIENTRYP) (GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices);
		using PFNGLGETACTIVEUNIFORMSIVPROC = void (APIENTRYP) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params);
		using PFNGLGETACTIVEUNIFORMNAMEPROC = void (APIENTRYP) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformName);
		using PFNGLGETUNIFORMBLOCKINDEXPROC = GLuint (APIENTRYP) (GLuint program, const GLchar* uniformBlockName);
		using PFNGLGETACTIVEUNIFORMBLOCKIVPROC = void (APIENTRYP) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params);
		using PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC = void (APIENTRYP) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName);
		using PFNGLUNIFORMBLOCKBINDINGPROC = void (APIENTRYP) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);

	private:
		bool Available;

	public:
		Version31() = delete;
		Version31(Func_GetProcAddress GetProcAddress);
		inline bool Version31IsAvailable() { return Available; }

		static constexpr GLenum SAMPLER_2D_RECT = 0x8B63;
		static constexpr GLenum SAMPLER_2D_RECT_SHADOW = 0x8B64;
		static constexpr GLenum SAMPLER_BUFFER = 0x8DC2;
		static constexpr GLenum INT_SAMPLER_2D_RECT = 0x8DCD;
		static constexpr GLenum INT_SAMPLER_BUFFER = 0x8DD0;
		static constexpr GLenum UNSIGNED_INT_SAMPLER_2D_RECT = 0x8DD5;
		static constexpr GLenum UNSIGNED_INT_SAMPLER_BUFFER = 0x8DD8;
		static constexpr GLenum TEXTURE_BUFFER = 0x8C2A;
		static constexpr GLenum MAX_TEXTURE_BUFFER_SIZE = 0x8C2B;
		static constexpr GLenum TEXTURE_BINDING_BUFFER = 0x8C2C;
		static constexpr GLenum TEXTURE_BUFFER_DATA_STORE_BINDING = 0x8C2D;
		static constexpr GLenum TEXTURE_RECTANGLE = 0x84F5;
		static constexpr GLenum TEXTURE_BINDING_RECTANGLE = 0x84F6;
		static constexpr GLenum PROXY_TEXTURE_RECTANGLE = 0x84F7;
		static constexpr GLenum MAX_RECTANGLE_TEXTURE_SIZE = 0x84F8;
		static constexpr GLenum R8_SNORM = 0x8F94;
		static constexpr GLenum RG8_SNORM = 0x8F95;
		static constexpr GLenum RGB8_SNORM = 0x8F96;
		static constexpr GLenum RGBA8_SNORM = 0x8F97;
		static constexpr GLenum R16_SNORM = 0x8F98;
		static constexpr GLenum RG16_SNORM = 0x8F99;
		static constexpr GLenum RGB16_SNORM = 0x8F9A;
		static constexpr GLenum RGBA16_SNORM = 0x8F9B;
		static constexpr GLenum SIGNED_NORMALIZED = 0x8F9C;
		static constexpr GLenum PRIMITIVE_RESTART = 0x8F9D;
		static constexpr GLenum PRIMITIVE_RESTART_INDEX = 0x8F9E;
		static constexpr GLenum COPY_READ_BUFFER = 0x8F36;
		static constexpr GLenum COPY_WRITE_BUFFER = 0x8F37;
		static constexpr GLenum UNIFORM_BUFFER = 0x8A11;
		static constexpr GLenum UNIFORM_BUFFER_BINDING = 0x8A28;
		static constexpr GLenum UNIFORM_BUFFER_START = 0x8A29;
		static constexpr GLenum UNIFORM_BUFFER_SIZE = 0x8A2A;
		static constexpr GLenum MAX_VERTEX_UNIFORM_BLOCKS = 0x8A2B;
		static constexpr GLenum MAX_GEOMETRY_UNIFORM_BLOCKS = 0x8A2C;
		static constexpr GLenum MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8A2D;
		static constexpr GLenum MAX_COMBINED_UNIFORM_BLOCKS = 0x8A2E;
		static constexpr GLenum MAX_UNIFORM_BUFFER_BINDINGS = 0x8A2F;
		static constexpr GLenum MAX_UNIFORM_BLOCK_SIZE = 0x8A30;
		static constexpr GLenum MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8A31;
		static constexpr GLenum MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS = 0x8A32;
		static constexpr GLenum MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8A33;
		static constexpr GLenum UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8A34;
		static constexpr GLenum ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH = 0x8A35;
		static constexpr GLenum ACTIVE_UNIFORM_BLOCKS = 0x8A36;
		static constexpr GLenum UNIFORM_TYPE = 0x8A37;
		static constexpr GLenum UNIFORM_SIZE = 0x8A38;
		static constexpr GLenum UNIFORM_NAME_LENGTH = 0x8A39;
		static constexpr GLenum UNIFORM_BLOCK_INDEX = 0x8A3A;
		static constexpr GLenum UNIFORM_OFFSET = 0x8A3B;
		static constexpr GLenum UNIFORM_ARRAY_STRIDE = 0x8A3C;
		static constexpr GLenum UNIFORM_MATRIX_STRIDE = 0x8A3D;
		static constexpr GLenum UNIFORM_IS_ROW_MAJOR = 0x8A3E;
		static constexpr GLenum UNIFORM_BLOCK_BINDING = 0x8A3F;
		static constexpr GLenum UNIFORM_BLOCK_DATA_SIZE = 0x8A40;
		static constexpr GLenum UNIFORM_BLOCK_NAME_LENGTH = 0x8A41;
		static constexpr GLenum UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8A42;
		static constexpr GLenum UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8A43;
		static constexpr GLenum UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8A44;
		static constexpr GLenum UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER = 0x8A45;
		static constexpr GLenum UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8A46;
		static constexpr GLuint INVALID_INDEX = 0xFFFFFFFFu;

		PFNGLDRAWARRAYSINSTANCEDPROC DrawArraysInstanced;
		PFNGLDRAWELEMENTSINSTANCEDPROC DrawElementsInstanced;
		PFNGLTEXBUFFERPROC TexBuffer;
		PFNGLPRIMITIVERESTARTINDEXPROC PrimitiveRestartIndex;
		PFNGLCOPYBUFFERSUBDATAPROC CopyBufferSubData;
		PFNGLGETUNIFORMINDICESPROC GetUniformIndices;
		PFNGLGETACTIVEUNIFORMSIVPROC GetActiveUniformsiv;
		PFNGLGETACTIVEUNIFORMNAMEPROC GetActiveUniformName;
		PFNGLGETUNIFORMBLOCKINDEXPROC GetUniformBlockIndex;
		PFNGLGETACTIVEUNIFORMBLOCKIVPROC GetActiveUniformBlockiv;
		PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC GetActiveUniformBlockName;
		PFNGLUNIFORMBLOCKBINDINGPROC UniformBlockBinding;

	};
	typedef struct __GLsync *GLsync;
	typedef khronos_uint64_t GLuint64;
	typedef khronos_int64_t GLint64;

	class Version32 : public Version31
	{
	protected:
		using PFNGLDRAWELEMENTSBASEVERTEXPROC = void (APIENTRYP) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLint basevertex);
		using PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC = void (APIENTRYP) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices, GLint basevertex);
		using PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC = void (APIENTRYP) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount, GLint basevertex);
		using PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC = void (APIENTRYP) (GLenum mode, const GLsizei* count, GLenum type, const void* const* indices, GLsizei drawcount, const GLint* basevertex);
		using PFNGLPROVOKINGVERTEXPROC = void (APIENTRYP) (GLenum mode);
		using PFNGLFENCESYNCPROC = GLsync (APIENTRYP) (GLenum condition, GLbitfield flags);
		using PFNGLISSYNCPROC = GLboolean (APIENTRYP) (GLsync sync);
		using PFNGLDELETESYNCPROC = void (APIENTRYP) (GLsync sync);
		using PFNGLCLIENTWAITSYNCPROC = GLenum (APIENTRYP) (GLsync sync, GLbitfield flags, GLuint64 timeout);
		using PFNGLWAITSYNCPROC = void (APIENTRYP) (GLsync sync, GLbitfield flags, GLuint64 timeout);
		using PFNGLGETINTEGER64VPROC = void (APIENTRYP) (GLenum pname, GLint64* data);
		using PFNGLGETSYNCIVPROC = void (APIENTRYP) (GLsync sync, GLenum pname, GLsizei count, GLsizei* length, GLint* values);
		using PFNGLGETINTEGER64I_VPROC = void (APIENTRYP) (GLenum target, GLuint index, GLint64* data);
		using PFNGLGETBUFFERPARAMETERI64VPROC = void (APIENTRYP) (GLenum target, GLenum pname, GLint64* params);
		using PFNGLFRAMEBUFFERTEXTUREPROC = void (APIENTRYP) (GLenum target, GLenum attachment, GLuint texture, GLint level);
		using PFNGLTEXIMAGE2DMULTISAMPLEPROC = void (APIENTRYP) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
		using PFNGLTEXIMAGE3DMULTISAMPLEPROC = void (APIENTRYP) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
		using PFNGLGETMULTISAMPLEFVPROC = void (APIENTRYP) (GLenum pname, GLuint index, GLfloat* val);
		using PFNGLSAMPLEMASKIPROC = void (APIENTRYP) (GLuint maskNumber, GLbitfield mask);

	private:
		bool Available;

	public:
		Version32() = delete;
		Version32(Func_GetProcAddress GetProcAddress);
		inline bool Version32IsAvailable() { return Available; }

		static constexpr GLbitfield CONTEXT_CORE_PROFILE_BIT = 0x00000001;
		static constexpr GLbitfield CONTEXT_COMPATIBILITY_PROFILE_BIT = 0x00000002;
		static constexpr GLenum LINES_ADJACENCY = 0x000A;
		static constexpr GLenum LINE_STRIP_ADJACENCY = 0x000B;
		static constexpr GLenum TRIANGLES_ADJACENCY = 0x000C;
		static constexpr GLenum TRIANGLE_STRIP_ADJACENCY = 0x000D;
		static constexpr GLenum PROGRAM_POINT_SIZE = 0x8642;
		static constexpr GLenum MAX_GEOMETRY_TEXTURE_IMAGE_UNITS = 0x8C29;
		static constexpr GLenum FRAMEBUFFER_ATTACHMENT_LAYERED = 0x8DA7;
		static constexpr GLenum FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS = 0x8DA8;
		static constexpr GLenum GEOMETRY_SHADER = 0x8DD9;
		static constexpr GLenum GEOMETRY_VERTICES_OUT = 0x8916;
		static constexpr GLenum GEOMETRY_INPUT_TYPE = 0x8917;
		static constexpr GLenum GEOMETRY_OUTPUT_TYPE = 0x8918;
		static constexpr GLenum MAX_GEOMETRY_UNIFORM_COMPONENTS = 0x8DDF;
		static constexpr GLenum MAX_GEOMETRY_OUTPUT_VERTICES = 0x8DE0;
		static constexpr GLenum MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS = 0x8DE1;
		static constexpr GLenum MAX_VERTEX_OUTPUT_COMPONENTS = 0x9122;
		static constexpr GLenum MAX_GEOMETRY_INPUT_COMPONENTS = 0x9123;
		static constexpr GLenum MAX_GEOMETRY_OUTPUT_COMPONENTS = 0x9124;
		static constexpr GLenum MAX_FRAGMENT_INPUT_COMPONENTS = 0x9125;
		static constexpr GLenum CONTEXT_PROFILE_MASK = 0x9126;
		static constexpr GLenum DEPTH_CLAMP = 0x864F;
		static constexpr GLenum QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION = 0x8E4C;
		static constexpr GLenum FIRST_VERTEX_CONVENTION = 0x8E4D;
		static constexpr GLenum LAST_VERTEX_CONVENTION = 0x8E4E;
		static constexpr GLenum PROVOKING_VERTEX = 0x8E4F;
		static constexpr GLenum TEXTURE_CUBE_MAP_SEAMLESS = 0x884F;
		static constexpr GLenum MAX_SERVER_WAIT_TIMEOUT = 0x9111;
		static constexpr GLenum OBJECT_TYPE = 0x9112;
		static constexpr GLenum SYNC_CONDITION = 0x9113;
		static constexpr GLenum SYNC_STATUS = 0x9114;
		static constexpr GLenum SYNC_FLAGS = 0x9115;
		static constexpr GLenum SYNC_FENCE = 0x9116;
		static constexpr GLenum SYNC_GPU_COMMANDS_COMPLETE = 0x9117;
		static constexpr GLenum UNSIGNALED = 0x9118;
		static constexpr GLenum SIGNALED = 0x9119;
		static constexpr GLenum ALREADY_SIGNALED = 0x911A;
		static constexpr GLenum TIMEOUT_EXPIRED = 0x911B;
		static constexpr GLenum CONDITION_SATISFIED = 0x911C;
		static constexpr GLenum WAIT_FAILED = 0x911D;
		static constexpr GLuint64 TIMEOUT_IGNORED = 0xFFFFFFFFFFFFFFFFull;
		static constexpr GLbitfield SYNC_FLUSH_COMMANDS_BIT = 0x00000001;
		static constexpr GLenum SAMPLE_POSITION = 0x8E50;
		static constexpr GLenum SAMPLE_MASK = 0x8E51;
		static constexpr GLenum SAMPLE_MASK_VALUE = 0x8E52;
		static constexpr GLenum MAX_SAMPLE_MASK_WORDS = 0x8E59;
		static constexpr GLenum TEXTURE_2D_MULTISAMPLE = 0x9100;
		static constexpr GLenum PROXY_TEXTURE_2D_MULTISAMPLE = 0x9101;
		static constexpr GLenum TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9102;
		static constexpr GLenum PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9103;
		static constexpr GLenum TEXTURE_BINDING_2D_MULTISAMPLE = 0x9104;
		static constexpr GLenum TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY = 0x9105;
		static constexpr GLenum TEXTURE_SAMPLES = 0x9106;
		static constexpr GLenum TEXTURE_FIXED_SAMPLE_LOCATIONS = 0x9107;
		static constexpr GLenum SAMPLER_2D_MULTISAMPLE = 0x9108;
		static constexpr GLenum INT_SAMPLER_2D_MULTISAMPLE = 0x9109;
		static constexpr GLenum UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE = 0x910A;
		static constexpr GLenum SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910B;
		static constexpr GLenum INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910C;
		static constexpr GLenum UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910D;
		static constexpr GLenum MAX_COLOR_TEXTURE_SAMPLES = 0x910E;
		static constexpr GLenum MAX_DEPTH_TEXTURE_SAMPLES = 0x910F;
		static constexpr GLenum MAX_INTEGER_SAMPLES = 0x9110;

		PFNGLDRAWELEMENTSBASEVERTEXPROC DrawElementsBaseVertex;
		PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC DrawRangeElementsBaseVertex;
		PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC DrawElementsInstancedBaseVertex;
		PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC MultiDrawElementsBaseVertex;
		PFNGLPROVOKINGVERTEXPROC ProvokingVertex;
		PFNGLFENCESYNCPROC FenceSync;
		PFNGLISSYNCPROC IsSync;
		PFNGLDELETESYNCPROC DeleteSync;
		PFNGLCLIENTWAITSYNCPROC ClientWaitSync;
		PFNGLWAITSYNCPROC WaitSync;
		PFNGLGETINTEGER64VPROC GetInteger64v;
		PFNGLGETSYNCIVPROC GetSynciv;
		PFNGLGETINTEGER64I_VPROC GetInteger64i_v;
		PFNGLGETBUFFERPARAMETERI64VPROC GetBufferParameteri64v;
		PFNGLFRAMEBUFFERTEXTUREPROC FramebufferTexture;
		PFNGLTEXIMAGE2DMULTISAMPLEPROC TexImage2DMultisample;
		PFNGLTEXIMAGE3DMULTISAMPLEPROC TexImage3DMultisample;
		PFNGLGETMULTISAMPLEFVPROC GetMultisamplefv;
		PFNGLSAMPLEMASKIPROC SampleMaski;

	};

	class Version33 : public Version32
	{
	protected:
		using PFNGLBINDFRAGDATALOCATIONINDEXEDPROC = void (APIENTRYP) (GLuint program, GLuint colorNumber, GLuint index, const GLchar* name);
		using PFNGLGETFRAGDATAINDEXPROC = GLint (APIENTRYP) (GLuint program, const GLchar* name);
		using PFNGLGENSAMPLERSPROC = void (APIENTRYP) (GLsizei count, GLuint* samplers);
		using PFNGLDELETESAMPLERSPROC = void (APIENTRYP) (GLsizei count, const GLuint* samplers);
		using PFNGLISSAMPLERPROC = GLboolean (APIENTRYP) (GLuint sampler);
		using PFNGLBINDSAMPLERPROC = void (APIENTRYP) (GLuint unit, GLuint sampler);
		using PFNGLSAMPLERPARAMETERIPROC = void (APIENTRYP) (GLuint sampler, GLenum pname, GLint param);
		using PFNGLSAMPLERPARAMETERIVPROC = void (APIENTRYP) (GLuint sampler, GLenum pname, const GLint* param);
		using PFNGLSAMPLERPARAMETERFPROC = void (APIENTRYP) (GLuint sampler, GLenum pname, GLfloat param);
		using PFNGLSAMPLERPARAMETERFVPROC = void (APIENTRYP) (GLuint sampler, GLenum pname, const GLfloat* param);
		using PFNGLSAMPLERPARAMETERIIVPROC = void (APIENTRYP) (GLuint sampler, GLenum pname, const GLint* param);
		using PFNGLSAMPLERPARAMETERIUIVPROC = void (APIENTRYP) (GLuint sampler, GLenum pname, const GLuint* param);
		using PFNGLGETSAMPLERPARAMETERIVPROC = void (APIENTRYP) (GLuint sampler, GLenum pname, GLint* params);
		using PFNGLGETSAMPLERPARAMETERIIVPROC = void (APIENTRYP) (GLuint sampler, GLenum pname, GLint* params);
		using PFNGLGETSAMPLERPARAMETERFVPROC = void (APIENTRYP) (GLuint sampler, GLenum pname, GLfloat* params);
		using PFNGLGETSAMPLERPARAMETERIUIVPROC = void (APIENTRYP) (GLuint sampler, GLenum pname, GLuint* params);
		using PFNGLQUERYCOUNTERPROC = void (APIENTRYP) (GLuint id, GLenum target);
		using PFNGLGETQUERYOBJECTI64VPROC = void (APIENTRYP) (GLuint id, GLenum pname, GLint64* params);
		using PFNGLGETQUERYOBJECTUI64VPROC = void (APIENTRYP) (GLuint id, GLenum pname, GLuint64* params);
		using PFNGLVERTEXATTRIBDIVISORPROC = void (APIENTRYP) (GLuint index, GLuint divisor);
		using PFNGLVERTEXATTRIBP1UIPROC = void (APIENTRYP) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
		using PFNGLVERTEXATTRIBP1UIVPROC = void (APIENTRYP) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value);
		using PFNGLVERTEXATTRIBP2UIPROC = void (APIENTRYP) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
		using PFNGLVERTEXATTRIBP2UIVPROC = void (APIENTRYP) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value);
		using PFNGLVERTEXATTRIBP3UIPROC = void (APIENTRYP) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
		using PFNGLVERTEXATTRIBP3UIVPROC = void (APIENTRYP) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value);
		using PFNGLVERTEXATTRIBP4UIPROC = void (APIENTRYP) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
		using PFNGLVERTEXATTRIBP4UIVPROC = void (APIENTRYP) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value);
		using PFNGLVERTEXP2UIPROC = void (APIENTRYP) (GLenum type, GLuint value);
		using PFNGLVERTEXP2UIVPROC = void (APIENTRYP) (GLenum type, const GLuint* value);
		using PFNGLVERTEXP3UIPROC = void (APIENTRYP) (GLenum type, GLuint value);
		using PFNGLVERTEXP3UIVPROC = void (APIENTRYP) (GLenum type, const GLuint* value);
		using PFNGLVERTEXP4UIPROC = void (APIENTRYP) (GLenum type, GLuint value);
		using PFNGLVERTEXP4UIVPROC = void (APIENTRYP) (GLenum type, const GLuint* value);
		using PFNGLTEXCOORDP1UIPROC = void (APIENTRYP) (GLenum type, GLuint coords);
		using PFNGLTEXCOORDP1UIVPROC = void (APIENTRYP) (GLenum type, const GLuint* coords);
		using PFNGLTEXCOORDP2UIPROC = void (APIENTRYP) (GLenum type, GLuint coords);
		using PFNGLTEXCOORDP2UIVPROC = void (APIENTRYP) (GLenum type, const GLuint* coords);
		using PFNGLTEXCOORDP3UIPROC = void (APIENTRYP) (GLenum type, GLuint coords);
		using PFNGLTEXCOORDP3UIVPROC = void (APIENTRYP) (GLenum type, const GLuint* coords);
		using PFNGLTEXCOORDP4UIPROC = void (APIENTRYP) (GLenum type, GLuint coords);
		using PFNGLTEXCOORDP4UIVPROC = void (APIENTRYP) (GLenum type, const GLuint* coords);
		using PFNGLMULTITEXCOORDP1UIPROC = void (APIENTRYP) (GLenum texture, GLenum type, GLuint coords);
		using PFNGLMULTITEXCOORDP1UIVPROC = void (APIENTRYP) (GLenum texture, GLenum type, const GLuint* coords);
		using PFNGLMULTITEXCOORDP2UIPROC = void (APIENTRYP) (GLenum texture, GLenum type, GLuint coords);
		using PFNGLMULTITEXCOORDP2UIVPROC = void (APIENTRYP) (GLenum texture, GLenum type, const GLuint* coords);
		using PFNGLMULTITEXCOORDP3UIPROC = void (APIENTRYP) (GLenum texture, GLenum type, GLuint coords);
		using PFNGLMULTITEXCOORDP3UIVPROC = void (APIENTRYP) (GLenum texture, GLenum type, const GLuint* coords);
		using PFNGLMULTITEXCOORDP4UIPROC = void (APIENTRYP) (GLenum texture, GLenum type, GLuint coords);
		using PFNGLMULTITEXCOORDP4UIVPROC = void (APIENTRYP) (GLenum texture, GLenum type, const GLuint* coords);
		using PFNGLNORMALP3UIPROC = void (APIENTRYP) (GLenum type, GLuint coords);
		using PFNGLNORMALP3UIVPROC = void (APIENTRYP) (GLenum type, const GLuint* coords);
		using PFNGLCOLORP3UIPROC = void (APIENTRYP) (GLenum type, GLuint color);
		using PFNGLCOLORP3UIVPROC = void (APIENTRYP) (GLenum type, const GLuint* color);
		using PFNGLCOLORP4UIPROC = void (APIENTRYP) (GLenum type, GLuint color);
		using PFNGLCOLORP4UIVPROC = void (APIENTRYP) (GLenum type, const GLuint* color);
		using PFNGLSECONDARYCOLORP3UIPROC = void (APIENTRYP) (GLenum type, GLuint color);
		using PFNGLSECONDARYCOLORP3UIVPROC = void (APIENTRYP) (GLenum type, const GLuint* color);

	private:
		bool Available;

	public:
		Version33() = delete;
		Version33(Func_GetProcAddress GetProcAddress);
		inline bool Version33IsAvailable() { return Available; }

		static constexpr GLenum VERTEX_ATTRIB_ARRAY_DIVISOR = 0x88FE;
		static constexpr GLenum SRC1_COLOR = 0x88F9;
		static constexpr GLenum ONE_MINUS_SRC1_COLOR = 0x88FA;
		static constexpr GLenum ONE_MINUS_SRC1_ALPHA = 0x88FB;
		static constexpr GLenum MAX_DUAL_SOURCE_DRAW_BUFFERS = 0x88FC;
		static constexpr GLenum ANY_SAMPLES_PASSED = 0x8C2F;
		static constexpr GLenum SAMPLER_BINDING = 0x8919;
		static constexpr GLenum RGB10_A2UI = 0x906F;
		static constexpr GLenum TEXTURE_SWIZZLE_R = 0x8E42;
		static constexpr GLenum TEXTURE_SWIZZLE_G = 0x8E43;
		static constexpr GLenum TEXTURE_SWIZZLE_B = 0x8E44;
		static constexpr GLenum TEXTURE_SWIZZLE_A = 0x8E45;
		static constexpr GLenum TEXTURE_SWIZZLE_RGBA = 0x8E46;
		static constexpr GLenum TIME_ELAPSED = 0x88BF;
		static constexpr GLenum TIMESTAMP = 0x8E28;
		static constexpr GLenum INT_2_10_10_10_REV = 0x8D9F;

		PFNGLBINDFRAGDATALOCATIONINDEXEDPROC BindFragDataLocationIndexed;
		PFNGLGETFRAGDATAINDEXPROC GetFragDataIndex;
		PFNGLGENSAMPLERSPROC GenSamplers;
		PFNGLDELETESAMPLERSPROC DeleteSamplers;
		PFNGLISSAMPLERPROC IsSampler;
		PFNGLBINDSAMPLERPROC BindSampler;
		PFNGLSAMPLERPARAMETERIPROC SamplerParameteri;
		PFNGLSAMPLERPARAMETERIVPROC SamplerParameteriv;
		PFNGLSAMPLERPARAMETERFPROC SamplerParameterf;
		PFNGLSAMPLERPARAMETERFVPROC SamplerParameterfv;
		PFNGLSAMPLERPARAMETERIIVPROC SamplerParameterIiv;
		PFNGLSAMPLERPARAMETERIUIVPROC SamplerParameterIuiv;
		PFNGLGETSAMPLERPARAMETERIVPROC GetSamplerParameteriv;
		PFNGLGETSAMPLERPARAMETERIIVPROC GetSamplerParameterIiv;
		PFNGLGETSAMPLERPARAMETERFVPROC GetSamplerParameterfv;
		PFNGLGETSAMPLERPARAMETERIUIVPROC GetSamplerParameterIuiv;
		PFNGLQUERYCOUNTERPROC QueryCounter;
		PFNGLGETQUERYOBJECTI64VPROC GetQueryObjecti64v;
		PFNGLGETQUERYOBJECTUI64VPROC GetQueryObjectui64v;
		PFNGLVERTEXATTRIBDIVISORPROC VertexAttribDivisor;
		PFNGLVERTEXATTRIBP1UIPROC VertexAttribP1ui;
		PFNGLVERTEXATTRIBP1UIVPROC VertexAttribP1uiv;
		PFNGLVERTEXATTRIBP2UIPROC VertexAttribP2ui;
		PFNGLVERTEXATTRIBP2UIVPROC VertexAttribP2uiv;
		PFNGLVERTEXATTRIBP3UIPROC VertexAttribP3ui;
		PFNGLVERTEXATTRIBP3UIVPROC VertexAttribP3uiv;
		PFNGLVERTEXATTRIBP4UIPROC VertexAttribP4ui;
		PFNGLVERTEXATTRIBP4UIVPROC VertexAttribP4uiv;
		PFNGLVERTEXP2UIPROC VertexP2ui;
		PFNGLVERTEXP2UIVPROC VertexP2uiv;
		PFNGLVERTEXP3UIPROC VertexP3ui;
		PFNGLVERTEXP3UIVPROC VertexP3uiv;
		PFNGLVERTEXP4UIPROC VertexP4ui;
		PFNGLVERTEXP4UIVPROC VertexP4uiv;
		PFNGLTEXCOORDP1UIPROC TexCoordP1ui;
		PFNGLTEXCOORDP1UIVPROC TexCoordP1uiv;
		PFNGLTEXCOORDP2UIPROC TexCoordP2ui;
		PFNGLTEXCOORDP2UIVPROC TexCoordP2uiv;
		PFNGLTEXCOORDP3UIPROC TexCoordP3ui;
		PFNGLTEXCOORDP3UIVPROC TexCoordP3uiv;
		PFNGLTEXCOORDP4UIPROC TexCoordP4ui;
		PFNGLTEXCOORDP4UIVPROC TexCoordP4uiv;
		PFNGLMULTITEXCOORDP1UIPROC MultiTexCoordP1ui;
		PFNGLMULTITEXCOORDP1UIVPROC MultiTexCoordP1uiv;
		PFNGLMULTITEXCOORDP2UIPROC MultiTexCoordP2ui;
		PFNGLMULTITEXCOORDP2UIVPROC MultiTexCoordP2uiv;
		PFNGLMULTITEXCOORDP3UIPROC MultiTexCoordP3ui;
		PFNGLMULTITEXCOORDP3UIVPROC MultiTexCoordP3uiv;
		PFNGLMULTITEXCOORDP4UIPROC MultiTexCoordP4ui;
		PFNGLMULTITEXCOORDP4UIVPROC MultiTexCoordP4uiv;
		PFNGLNORMALP3UIPROC NormalP3ui;
		PFNGLNORMALP3UIVPROC NormalP3uiv;
		PFNGLCOLORP3UIPROC ColorP3ui;
		PFNGLCOLORP3UIVPROC ColorP3uiv;
		PFNGLCOLORP4UIPROC ColorP4ui;
		PFNGLCOLORP4UIVPROC ColorP4uiv;
		PFNGLSECONDARYCOLORP3UIPROC SecondaryColorP3ui;
		PFNGLSECONDARYCOLORP3UIVPROC SecondaryColorP3uiv;

	};

	class Version40 : public Version33
	{
	protected:
		using PFNGLMINSAMPLESHADINGPROC = void (APIENTRYP) (GLfloat value);
		using PFNGLBLENDEQUATIONIPROC = void (APIENTRYP) (GLuint buf, GLenum mode);
		using PFNGLBLENDEQUATIONSEPARATEIPROC = void (APIENTRYP) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
		using PFNGLBLENDFUNCIPROC = void (APIENTRYP) (GLuint buf, GLenum src, GLenum dst);
		using PFNGLBLENDFUNCSEPARATEIPROC = void (APIENTRYP) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
		using PFNGLDRAWARRAYSINDIRECTPROC = void (APIENTRYP) (GLenum mode, const void* indirect);
		using PFNGLDRAWELEMENTSINDIRECTPROC = void (APIENTRYP) (GLenum mode, GLenum type, const void* indirect);
		using PFNGLUNIFORM1DPROC = void (APIENTRYP) (GLint location, GLdouble x);
		using PFNGLUNIFORM2DPROC = void (APIENTRYP) (GLint location, GLdouble x, GLdouble y);
		using PFNGLUNIFORM3DPROC = void (APIENTRYP) (GLint location, GLdouble x, GLdouble y, GLdouble z);
		using PFNGLUNIFORM4DPROC = void (APIENTRYP) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
		using PFNGLUNIFORM1DVPROC = void (APIENTRYP) (GLint location, GLsizei count, const GLdouble* value);
		using PFNGLUNIFORM2DVPROC = void (APIENTRYP) (GLint location, GLsizei count, const GLdouble* value);
		using PFNGLUNIFORM3DVPROC = void (APIENTRYP) (GLint location, GLsizei count, const GLdouble* value);
		using PFNGLUNIFORM4DVPROC = void (APIENTRYP) (GLint location, GLsizei count, const GLdouble* value);
		using PFNGLUNIFORMMATRIX2DVPROC = void (APIENTRYP) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
		using PFNGLUNIFORMMATRIX3DVPROC = void (APIENTRYP) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
		using PFNGLUNIFORMMATRIX4DVPROC = void (APIENTRYP) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
		using PFNGLUNIFORMMATRIX2X3DVPROC = void (APIENTRYP) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
		using PFNGLUNIFORMMATRIX2X4DVPROC = void (APIENTRYP) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
		using PFNGLUNIFORMMATRIX3X2DVPROC = void (APIENTRYP) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
		using PFNGLUNIFORMMATRIX3X4DVPROC = void (APIENTRYP) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
		using PFNGLUNIFORMMATRIX4X2DVPROC = void (APIENTRYP) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
		using PFNGLUNIFORMMATRIX4X3DVPROC = void (APIENTRYP) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
		using PFNGLGETUNIFORMDVPROC = void (APIENTRYP) (GLuint program, GLint location, GLdouble* params);
		using PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC = GLint (APIENTRYP) (GLuint program, GLenum shadertype, const GLchar* name);
		using PFNGLGETSUBROUTINEINDEXPROC = GLuint (APIENTRYP) (GLuint program, GLenum shadertype, const GLchar* name);
		using PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC = void (APIENTRYP) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint* values);
		using PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC = void (APIENTRYP) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei* length, GLchar* name);
		using PFNGLGETACTIVESUBROUTINENAMEPROC = void (APIENTRYP) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei* length, GLchar* name);
		using PFNGLUNIFORMSUBROUTINESUIVPROC = void (APIENTRYP) (GLenum shadertype, GLsizei count, const GLuint* indices);
		using PFNGLGETUNIFORMSUBROUTINEUIVPROC = void (APIENTRYP) (GLenum shadertype, GLint location, GLuint* params);
		using PFNGLGETPROGRAMSTAGEIVPROC = void (APIENTRYP) (GLuint program, GLenum shadertype, GLenum pname, GLint* values);
		using PFNGLPATCHPARAMETERIPROC = void (APIENTRYP) (GLenum pname, GLint value);
		using PFNGLPATCHPARAMETERFVPROC = void (APIENTRYP) (GLenum pname, const GLfloat* values);
		using PFNGLBINDTRANSFORMFEEDBACKPROC = void (APIENTRYP) (GLenum target, GLuint id);
		using PFNGLDELETETRANSFORMFEEDBACKSPROC = void (APIENTRYP) (GLsizei n, const GLuint* ids);
		using PFNGLGENTRANSFORMFEEDBACKSPROC = void (APIENTRYP) (GLsizei n, GLuint* ids);
		using PFNGLISTRANSFORMFEEDBACKPROC = GLboolean (APIENTRYP) (GLuint id);
		using PFNGLPAUSETRANSFORMFEEDBACKPROC = void (APIENTRYP) (void);
		using PFNGLRESUMETRANSFORMFEEDBACKPROC = void (APIENTRYP) (void);
		using PFNGLDRAWTRANSFORMFEEDBACKPROC = void (APIENTRYP) (GLenum mode, GLuint id);
		using PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC = void (APIENTRYP) (GLenum mode, GLuint id, GLuint stream);
		using PFNGLBEGINQUERYINDEXEDPROC = void (APIENTRYP) (GLenum target, GLuint index, GLuint id);
		using PFNGLENDQUERYINDEXEDPROC = void (APIENTRYP) (GLenum target, GLuint index);
		using PFNGLGETQUERYINDEXEDIVPROC = void (APIENTRYP) (GLenum target, GLuint index, GLenum pname, GLint* params);

	private:
		bool Available;

	public:
		Version40() = delete;
		Version40(Func_GetProcAddress GetProcAddress);
		inline bool Version40IsAvailable() { return Available; }

		static constexpr GLenum SAMPLE_SHADING = 0x8C36;
		static constexpr GLenum MIN_SAMPLE_SHADING_VALUE = 0x8C37;
		static constexpr GLenum MIN_PROGRAM_TEXTURE_GATHER_OFFSET = 0x8E5E;
		static constexpr GLenum MAX_PROGRAM_TEXTURE_GATHER_OFFSET = 0x8E5F;
		static constexpr GLenum TEXTURE_CUBE_MAP_ARRAY = 0x9009;
		static constexpr GLenum TEXTURE_BINDING_CUBE_MAP_ARRAY = 0x900A;
		static constexpr GLenum PROXY_TEXTURE_CUBE_MAP_ARRAY = 0x900B;
		static constexpr GLenum SAMPLER_CUBE_MAP_ARRAY = 0x900C;
		static constexpr GLenum SAMPLER_CUBE_MAP_ARRAY_SHADOW = 0x900D;
		static constexpr GLenum INT_SAMPLER_CUBE_MAP_ARRAY = 0x900E;
		static constexpr GLenum UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY = 0x900F;
		static constexpr GLenum DRAW_INDIRECT_BUFFER = 0x8F3F;
		static constexpr GLenum DRAW_INDIRECT_BUFFER_BINDING = 0x8F43;
		static constexpr GLenum GEOMETRY_SHADER_INVOCATIONS = 0x887F;
		static constexpr GLenum MAX_GEOMETRY_SHADER_INVOCATIONS = 0x8E5A;
		static constexpr GLenum MIN_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5B;
		static constexpr GLenum MAX_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5C;
		static constexpr GLenum FRAGMENT_INTERPOLATION_OFFSET_BITS = 0x8E5D;
		static constexpr GLenum MAX_VERTEX_STREAMS = 0x8E71;
		static constexpr GLenum DOUBLE_VEC2 = 0x8FFC;
		static constexpr GLenum DOUBLE_VEC3 = 0x8FFD;
		static constexpr GLenum DOUBLE_VEC4 = 0x8FFE;
		static constexpr GLenum DOUBLE_MAT2 = 0x8F46;
		static constexpr GLenum DOUBLE_MAT3 = 0x8F47;
		static constexpr GLenum DOUBLE_MAT4 = 0x8F48;
		static constexpr GLenum DOUBLE_MAT2x3 = 0x8F49;
		static constexpr GLenum DOUBLE_MAT2x4 = 0x8F4A;
		static constexpr GLenum DOUBLE_MAT3x2 = 0x8F4B;
		static constexpr GLenum DOUBLE_MAT3x4 = 0x8F4C;
		static constexpr GLenum DOUBLE_MAT4x2 = 0x8F4D;
		static constexpr GLenum DOUBLE_MAT4x3 = 0x8F4E;
		static constexpr GLenum ACTIVE_SUBROUTINES = 0x8DE5;
		static constexpr GLenum ACTIVE_SUBROUTINE_UNIFORMS = 0x8DE6;
		static constexpr GLenum ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS = 0x8E47;
		static constexpr GLenum ACTIVE_SUBROUTINE_MAX_LENGTH = 0x8E48;
		static constexpr GLenum ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH = 0x8E49;
		static constexpr GLenum MAX_SUBROUTINES = 0x8DE7;
		static constexpr GLenum MAX_SUBROUTINE_UNIFORM_LOCATIONS = 0x8DE8;
		static constexpr GLenum NUM_COMPATIBLE_SUBROUTINES = 0x8E4A;
		static constexpr GLenum COMPATIBLE_SUBROUTINES = 0x8E4B;
		static constexpr GLenum PATCHES = 0x000E;
		static constexpr GLenum PATCH_VERTICES = 0x8E72;
		static constexpr GLenum PATCH_DEFAULT_INNER_LEVEL = 0x8E73;
		static constexpr GLenum PATCH_DEFAULT_OUTER_LEVEL = 0x8E74;
		static constexpr GLenum TESS_CONTROL_OUTPUT_VERTICES = 0x8E75;
		static constexpr GLenum TESS_GEN_MODE = 0x8E76;
		static constexpr GLenum TESS_GEN_SPACING = 0x8E77;
		static constexpr GLenum TESS_GEN_VERTEX_ORDER = 0x8E78;
		static constexpr GLenum TESS_GEN_POINT_MODE = 0x8E79;
		static constexpr GLenum ISOLINES = 0x8E7A;
		static constexpr GLenum FRACTIONAL_ODD = 0x8E7B;
		static constexpr GLenum FRACTIONAL_EVEN = 0x8E7C;
		static constexpr GLenum MAX_PATCH_VERTICES = 0x8E7D;
		static constexpr GLenum MAX_TESS_GEN_LEVEL = 0x8E7E;
		static constexpr GLenum MAX_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E7F;
		static constexpr GLenum MAX_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E80;
		static constexpr GLenum MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS = 0x8E81;
		static constexpr GLenum MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS = 0x8E82;
		static constexpr GLenum MAX_TESS_CONTROL_OUTPUT_COMPONENTS = 0x8E83;
		static constexpr GLenum MAX_TESS_PATCH_COMPONENTS = 0x8E84;
		static constexpr GLenum MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS = 0x8E85;
		static constexpr GLenum MAX_TESS_EVALUATION_OUTPUT_COMPONENTS = 0x8E86;
		static constexpr GLenum MAX_TESS_CONTROL_UNIFORM_BLOCKS = 0x8E89;
		static constexpr GLenum MAX_TESS_EVALUATION_UNIFORM_BLOCKS = 0x8E8A;
		static constexpr GLenum MAX_TESS_CONTROL_INPUT_COMPONENTS = 0x886C;
		static constexpr GLenum MAX_TESS_EVALUATION_INPUT_COMPONENTS = 0x886D;
		static constexpr GLenum MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E1E;
		static constexpr GLenum MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E1F;
		static constexpr GLenum UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER = 0x84F0;
		static constexpr GLenum UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x84F1;
		static constexpr GLenum TESS_EVALUATION_SHADER = 0x8E87;
		static constexpr GLenum TESS_CONTROL_SHADER = 0x8E88;
		static constexpr GLenum TRANSFORM_FEEDBACK = 0x8E22;
		static constexpr GLenum TRANSFORM_FEEDBACK_BUFFER_PAUSED = 0x8E23;
		static constexpr GLenum TRANSFORM_FEEDBACK_BUFFER_ACTIVE = 0x8E24;
		static constexpr GLenum TRANSFORM_FEEDBACK_BINDING = 0x8E25;
		static constexpr GLenum MAX_TRANSFORM_FEEDBACK_BUFFERS = 0x8E70;

		PFNGLMINSAMPLESHADINGPROC MinSampleShading;
		PFNGLBLENDEQUATIONIPROC BlendEquationi;
		PFNGLBLENDEQUATIONSEPARATEIPROC BlendEquationSeparatei;
		PFNGLBLENDFUNCIPROC BlendFunci;
		PFNGLBLENDFUNCSEPARATEIPROC BlendFuncSeparatei;
		PFNGLDRAWARRAYSINDIRECTPROC DrawArraysIndirect;
		PFNGLDRAWELEMENTSINDIRECTPROC DrawElementsIndirect;
		PFNGLUNIFORM1DPROC Uniform1d;
		PFNGLUNIFORM2DPROC Uniform2d;
		PFNGLUNIFORM3DPROC Uniform3d;
		PFNGLUNIFORM4DPROC Uniform4d;
		PFNGLUNIFORM1DVPROC Uniform1dv;
		PFNGLUNIFORM2DVPROC Uniform2dv;
		PFNGLUNIFORM3DVPROC Uniform3dv;
		PFNGLUNIFORM4DVPROC Uniform4dv;
		PFNGLUNIFORMMATRIX2DVPROC UniformMatrix2dv;
		PFNGLUNIFORMMATRIX3DVPROC UniformMatrix3dv;
		PFNGLUNIFORMMATRIX4DVPROC UniformMatrix4dv;
		PFNGLUNIFORMMATRIX2X3DVPROC UniformMatrix2x3dv;
		PFNGLUNIFORMMATRIX2X4DVPROC UniformMatrix2x4dv;
		PFNGLUNIFORMMATRIX3X2DVPROC UniformMatrix3x2dv;
		PFNGLUNIFORMMATRIX3X4DVPROC UniformMatrix3x4dv;
		PFNGLUNIFORMMATRIX4X2DVPROC UniformMatrix4x2dv;
		PFNGLUNIFORMMATRIX4X3DVPROC UniformMatrix4x3dv;
		PFNGLGETUNIFORMDVPROC GetUniformdv;
		PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC GetSubroutineUniformLocation;
		PFNGLGETSUBROUTINEINDEXPROC GetSubroutineIndex;
		PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC GetActiveSubroutineUniformiv;
		PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC GetActiveSubroutineUniformName;
		PFNGLGETACTIVESUBROUTINENAMEPROC GetActiveSubroutineName;
		PFNGLUNIFORMSUBROUTINESUIVPROC UniformSubroutinesuiv;
		PFNGLGETUNIFORMSUBROUTINEUIVPROC GetUniformSubroutineuiv;
		PFNGLGETPROGRAMSTAGEIVPROC GetProgramStageiv;
		PFNGLPATCHPARAMETERIPROC PatchParameteri;
		PFNGLPATCHPARAMETERFVPROC PatchParameterfv;
		PFNGLBINDTRANSFORMFEEDBACKPROC BindTransformFeedback;
		PFNGLDELETETRANSFORMFEEDBACKSPROC DeleteTransformFeedbacks;
		PFNGLGENTRANSFORMFEEDBACKSPROC GenTransformFeedbacks;
		PFNGLISTRANSFORMFEEDBACKPROC IsTransformFeedback;
		PFNGLPAUSETRANSFORMFEEDBACKPROC PauseTransformFeedback;
		PFNGLRESUMETRANSFORMFEEDBACKPROC ResumeTransformFeedback;
		PFNGLDRAWTRANSFORMFEEDBACKPROC DrawTransformFeedback;
		PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC DrawTransformFeedbackStream;
		PFNGLBEGINQUERYINDEXEDPROC BeginQueryIndexed;
		PFNGLENDQUERYINDEXEDPROC EndQueryIndexed;
		PFNGLGETQUERYINDEXEDIVPROC GetQueryIndexediv;

		inline void Uniformd(GLint location, GLdouble x) const { Uniform1d(location, x);}
		inline void Uniformd(GLint location, GLdouble x, GLdouble y) const { Uniform2d(location, x, y);}
		inline void Uniformd(GLint location, GLdouble x, GLdouble y, GLdouble z) const { Uniform3d(location, x, y, z);}
		inline void Uniformd(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w) const { Uniform4d(location, x, y, z, w);}
	};

	class Version41 : public Version40
	{
	protected:
		using PFNGLRELEASESHADERCOMPILERPROC = void (APIENTRYP) (void);
		using PFNGLSHADERBINARYPROC = void (APIENTRYP) (GLsizei count, const GLuint* shaders, GLenum binaryFormat, const void* binary, GLsizei length);
		using PFNGLGETSHADERPRECISIONFORMATPROC = void (APIENTRYP) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
		using PFNGLDEPTHRANGEFPROC = void (APIENTRYP) (GLfloat n, GLfloat f);
		using PFNGLCLEARDEPTHFPROC = void (APIENTRYP) (GLfloat d);
		using PFNGLGETPROGRAMBINARYPROC = void (APIENTRYP) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, void* binary);
		using PFNGLPROGRAMBINARYPROC = void (APIENTRYP) (GLuint program, GLenum binaryFormat, const void* binary, GLsizei length);
		using PFNGLPROGRAMPARAMETERIPROC = void (APIENTRYP) (GLuint program, GLenum pname, GLint value);
		using PFNGLUSEPROGRAMSTAGESPROC = void (APIENTRYP) (GLuint pipeline, GLbitfield stages, GLuint program);
		using PFNGLACTIVESHADERPROGRAMPROC = void (APIENTRYP) (GLuint pipeline, GLuint program);
		using PFNGLCREATESHADERPROGRAMVPROC = GLuint (APIENTRYP) (GLenum type, GLsizei count, const GLchar* const* strings);
		using PFNGLBINDPROGRAMPIPELINEPROC = void (APIENTRYP) (GLuint pipeline);
		using PFNGLDELETEPROGRAMPIPELINESPROC = void (APIENTRYP) (GLsizei n, const GLuint* pipelines);
		using PFNGLGENPROGRAMPIPELINESPROC = void (APIENTRYP) (GLsizei n, GLuint* pipelines);
		using PFNGLISPROGRAMPIPELINEPROC = GLboolean (APIENTRYP) (GLuint pipeline);
		using PFNGLGETPROGRAMPIPELINEIVPROC = void (APIENTRYP) (GLuint pipeline, GLenum pname, GLint* params);
		using PFNGLPROGRAMUNIFORM1IPROC = void (APIENTRYP) (GLuint program, GLint location, GLint v0);
		using PFNGLPROGRAMUNIFORM1IVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, const GLint* value);
		using PFNGLPROGRAMUNIFORM1FPROC = void (APIENTRYP) (GLuint program, GLint location, GLfloat v0);
		using PFNGLPROGRAMUNIFORM1FVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
		using PFNGLPROGRAMUNIFORM1DPROC = void (APIENTRYP) (GLuint program, GLint location, GLdouble v0);
		using PFNGLPROGRAMUNIFORM1DVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
		using PFNGLPROGRAMUNIFORM1UIPROC = void (APIENTRYP) (GLuint program, GLint location, GLuint v0);
		using PFNGLPROGRAMUNIFORM1UIVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, const GLuint* value);
		using PFNGLPROGRAMUNIFORM2IPROC = void (APIENTRYP) (GLuint program, GLint location, GLint v0, GLint v1);
		using PFNGLPROGRAMUNIFORM2IVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, const GLint* value);
		using PFNGLPROGRAMUNIFORM2FPROC = void (APIENTRYP) (GLuint program, GLint location, GLfloat v0, GLfloat v1);
		using PFNGLPROGRAMUNIFORM2FVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
		using PFNGLPROGRAMUNIFORM2DPROC = void (APIENTRYP) (GLuint program, GLint location, GLdouble v0, GLdouble v1);
		using PFNGLPROGRAMUNIFORM2DVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
		using PFNGLPROGRAMUNIFORM2UIPROC = void (APIENTRYP) (GLuint program, GLint location, GLuint v0, GLuint v1);
		using PFNGLPROGRAMUNIFORM2UIVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, const GLuint* value);
		using PFNGLPROGRAMUNIFORM3IPROC = void (APIENTRYP) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
		using PFNGLPROGRAMUNIFORM3IVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, const GLint* value);
		using PFNGLPROGRAMUNIFORM3FPROC = void (APIENTRYP) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
		using PFNGLPROGRAMUNIFORM3FVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
		using PFNGLPROGRAMUNIFORM3DPROC = void (APIENTRYP) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
		using PFNGLPROGRAMUNIFORM3DVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
		using PFNGLPROGRAMUNIFORM3UIPROC = void (APIENTRYP) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
		using PFNGLPROGRAMUNIFORM3UIVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, const GLuint* value);
		using PFNGLPROGRAMUNIFORM4IPROC = void (APIENTRYP) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
		using PFNGLPROGRAMUNIFORM4IVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, const GLint* value);
		using PFNGLPROGRAMUNIFORM4FPROC = void (APIENTRYP) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
		using PFNGLPROGRAMUNIFORM4FVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
		using PFNGLPROGRAMUNIFORM4DPROC = void (APIENTRYP) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
		using PFNGLPROGRAMUNIFORM4DVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
		using PFNGLPROGRAMUNIFORM4UIPROC = void (APIENTRYP) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
		using PFNGLPROGRAMUNIFORM4UIVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, const GLuint* value);
		using PFNGLPROGRAMUNIFORMMATRIX2FVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
		using PFNGLPROGRAMUNIFORMMATRIX3FVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
		using PFNGLPROGRAMUNIFORMMATRIX4FVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
		using PFNGLPROGRAMUNIFORMMATRIX2DVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
		using PFNGLPROGRAMUNIFORMMATRIX3DVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
		using PFNGLPROGRAMUNIFORMMATRIX4DVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
		using PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
		using PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
		using PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
		using PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
		using PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
		using PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
		using PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
		using PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
		using PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
		using PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
		using PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
		using PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
		using PFNGLVALIDATEPROGRAMPIPELINEPROC = void (APIENTRYP) (GLuint pipeline);
		using PFNGLGETPROGRAMPIPELINEINFOLOGPROC = void (APIENTRYP) (GLuint pipeline, GLsizei bufSize, GLsizei* length, GLchar* infoLog);
		using PFNGLVERTEXATTRIBL1DPROC = void (APIENTRYP) (GLuint index, GLdouble x);
		using PFNGLVERTEXATTRIBL2DPROC = void (APIENTRYP) (GLuint index, GLdouble x, GLdouble y);
		using PFNGLVERTEXATTRIBL3DPROC = void (APIENTRYP) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
		using PFNGLVERTEXATTRIBL4DPROC = void (APIENTRYP) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
		using PFNGLVERTEXATTRIBL1DVPROC = void (APIENTRYP) (GLuint index, const GLdouble* v);
		using PFNGLVERTEXATTRIBL2DVPROC = void (APIENTRYP) (GLuint index, const GLdouble* v);
		using PFNGLVERTEXATTRIBL3DVPROC = void (APIENTRYP) (GLuint index, const GLdouble* v);
		using PFNGLVERTEXATTRIBL4DVPROC = void (APIENTRYP) (GLuint index, const GLdouble* v);
		using PFNGLVERTEXATTRIBLPOINTERPROC = void (APIENTRYP) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer);
		using PFNGLGETVERTEXATTRIBLDVPROC = void (APIENTRYP) (GLuint index, GLenum pname, GLdouble* params);
		using PFNGLVIEWPORTARRAYVPROC = void (APIENTRYP) (GLuint first, GLsizei count, const GLfloat* v);
		using PFNGLVIEWPORTINDEXEDFPROC = void (APIENTRYP) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
		using PFNGLVIEWPORTINDEXEDFVPROC = void (APIENTRYP) (GLuint index, const GLfloat* v);
		using PFNGLSCISSORARRAYVPROC = void (APIENTRYP) (GLuint first, GLsizei count, const GLint* v);
		using PFNGLSCISSORINDEXEDPROC = void (APIENTRYP) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
		using PFNGLSCISSORINDEXEDVPROC = void (APIENTRYP) (GLuint index, const GLint* v);
		using PFNGLDEPTHRANGEARRAYVPROC = void (APIENTRYP) (GLuint first, GLsizei count, const GLdouble* v);
		using PFNGLDEPTHRANGEINDEXEDPROC = void (APIENTRYP) (GLuint index, GLdouble n, GLdouble f);
		using PFNGLGETFLOATI_VPROC = void (APIENTRYP) (GLenum target, GLuint index, GLfloat* data);
		using PFNGLGETDOUBLEI_VPROC = void (APIENTRYP) (GLenum target, GLuint index, GLdouble* data);

	private:
		bool Available;

	public:
		Version41() = delete;
		Version41(Func_GetProcAddress GetProcAddress);
		inline bool Version41IsAvailable() { return Available; }

		static constexpr GLenum FIXED = 0x140C;
		static constexpr GLenum IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A;
		static constexpr GLenum IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B;
		static constexpr GLenum LOW_FLOAT = 0x8DF0;
		static constexpr GLenum MEDIUM_FLOAT = 0x8DF1;
		static constexpr GLenum HIGH_FLOAT = 0x8DF2;
		static constexpr GLenum LOW_INT = 0x8DF3;
		static constexpr GLenum MEDIUM_INT = 0x8DF4;
		static constexpr GLenum HIGH_INT = 0x8DF5;
		static constexpr GLenum SHADER_COMPILER = 0x8DFA;
		static constexpr GLenum SHADER_BINARY_FORMATS = 0x8DF8;
		static constexpr GLenum NUM_SHADER_BINARY_FORMATS = 0x8DF9;
		static constexpr GLenum MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB;
		static constexpr GLenum MAX_VARYING_VECTORS = 0x8DFC;
		static constexpr GLenum MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD;
		static constexpr GLenum RGB565 = 0x8D62;
		static constexpr GLenum PROGRAM_BINARY_RETRIEVABLE_HINT = 0x8257;
		static constexpr GLenum PROGRAM_BINARY_LENGTH = 0x8741;
		static constexpr GLenum NUM_PROGRAM_BINARY_FORMATS = 0x87FE;
		static constexpr GLenum PROGRAM_BINARY_FORMATS = 0x87FF;
		static constexpr GLbitfield VERTEX_SHADER_BIT = 0x00000001;
		static constexpr GLbitfield FRAGMENT_SHADER_BIT = 0x00000002;
		static constexpr GLbitfield GEOMETRY_SHADER_BIT = 0x00000004;
		static constexpr GLbitfield TESS_CONTROL_SHADER_BIT = 0x00000008;
		static constexpr GLbitfield TESS_EVALUATION_SHADER_BIT = 0x00000010;
		static constexpr GLbitfield ALL_SHADER_BITS = 0xFFFFFFFF;
		static constexpr GLenum PROGRAM_SEPARABLE = 0x8258;
		static constexpr GLenum ACTIVE_PROGRAM = 0x8259;
		static constexpr GLenum PROGRAM_PIPELINE_BINDING = 0x825A;
		static constexpr GLenum MAX_VIEWPORTS = 0x825B;
		static constexpr GLenum VIEWPORT_SUBPIXEL_BITS = 0x825C;
		static constexpr GLenum VIEWPORT_BOUNDS_RANGE = 0x825D;
		static constexpr GLenum LAYER_PROVOKING_VERTEX = 0x825E;
		static constexpr GLenum VIEWPORT_INDEX_PROVOKING_VERTEX = 0x825F;
		static constexpr GLenum UNDEFINED_VERTEX = 0x8260;

		PFNGLRELEASESHADERCOMPILERPROC ReleaseShaderCompiler;
		PFNGLSHADERBINARYPROC ShaderBinary;
		PFNGLGETSHADERPRECISIONFORMATPROC GetShaderPrecisionFormat;
		PFNGLDEPTHRANGEFPROC DepthRangef;
		PFNGLCLEARDEPTHFPROC ClearDepthf;
		PFNGLGETPROGRAMBINARYPROC GetProgramBinary;
		PFNGLPROGRAMBINARYPROC ProgramBinary;
		PFNGLPROGRAMPARAMETERIPROC ProgramParameteri;
		PFNGLUSEPROGRAMSTAGESPROC UseProgramStages;
		PFNGLACTIVESHADERPROGRAMPROC ActiveShaderProgram;
		PFNGLCREATESHADERPROGRAMVPROC CreateShaderProgramv;
		PFNGLBINDPROGRAMPIPELINEPROC BindProgramPipeline;
		PFNGLDELETEPROGRAMPIPELINESPROC DeleteProgramPipelines;
		PFNGLGENPROGRAMPIPELINESPROC GenProgramPipelines;
		PFNGLISPROGRAMPIPELINEPROC IsProgramPipeline;
		PFNGLGETPROGRAMPIPELINEIVPROC GetProgramPipelineiv;
		PFNGLPROGRAMUNIFORM1IPROC ProgramUniform1i;
		PFNGLPROGRAMUNIFORM1IVPROC ProgramUniform1iv;
		PFNGLPROGRAMUNIFORM1FPROC ProgramUniform1f;
		PFNGLPROGRAMUNIFORM1FVPROC ProgramUniform1fv;
		PFNGLPROGRAMUNIFORM1DPROC ProgramUniform1d;
		PFNGLPROGRAMUNIFORM1DVPROC ProgramUniform1dv;
		PFNGLPROGRAMUNIFORM1UIPROC ProgramUniform1ui;
		PFNGLPROGRAMUNIFORM1UIVPROC ProgramUniform1uiv;
		PFNGLPROGRAMUNIFORM2IPROC ProgramUniform2i;
		PFNGLPROGRAMUNIFORM2IVPROC ProgramUniform2iv;
		PFNGLPROGRAMUNIFORM2FPROC ProgramUniform2f;
		PFNGLPROGRAMUNIFORM2FVPROC ProgramUniform2fv;
		PFNGLPROGRAMUNIFORM2DPROC ProgramUniform2d;
		PFNGLPROGRAMUNIFORM2DVPROC ProgramUniform2dv;
		PFNGLPROGRAMUNIFORM2UIPROC ProgramUniform2ui;
		PFNGLPROGRAMUNIFORM2UIVPROC ProgramUniform2uiv;
		PFNGLPROGRAMUNIFORM3IPROC ProgramUniform3i;
		PFNGLPROGRAMUNIFORM3IVPROC ProgramUniform3iv;
		PFNGLPROGRAMUNIFORM3FPROC ProgramUniform3f;
		PFNGLPROGRAMUNIFORM3FVPROC ProgramUniform3fv;
		PFNGLPROGRAMUNIFORM3DPROC ProgramUniform3d;
		PFNGLPROGRAMUNIFORM3DVPROC ProgramUniform3dv;
		PFNGLPROGRAMUNIFORM3UIPROC ProgramUniform3ui;
		PFNGLPROGRAMUNIFORM3UIVPROC ProgramUniform3uiv;
		PFNGLPROGRAMUNIFORM4IPROC ProgramUniform4i;
		PFNGLPROGRAMUNIFORM4IVPROC ProgramUniform4iv;
		PFNGLPROGRAMUNIFORM4FPROC ProgramUniform4f;
		PFNGLPROGRAMUNIFORM4FVPROC ProgramUniform4fv;
		PFNGLPROGRAMUNIFORM4DPROC ProgramUniform4d;
		PFNGLPROGRAMUNIFORM4DVPROC ProgramUniform4dv;
		PFNGLPROGRAMUNIFORM4UIPROC ProgramUniform4ui;
		PFNGLPROGRAMUNIFORM4UIVPROC ProgramUniform4uiv;
		PFNGLPROGRAMUNIFORMMATRIX2FVPROC ProgramUniformMatrix2fv;
		PFNGLPROGRAMUNIFORMMATRIX3FVPROC ProgramUniformMatrix3fv;
		PFNGLPROGRAMUNIFORMMATRIX4FVPROC ProgramUniformMatrix4fv;
		PFNGLPROGRAMUNIFORMMATRIX2DVPROC ProgramUniformMatrix2dv;
		PFNGLPROGRAMUNIFORMMATRIX3DVPROC ProgramUniformMatrix3dv;
		PFNGLPROGRAMUNIFORMMATRIX4DVPROC ProgramUniformMatrix4dv;
		PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC ProgramUniformMatrix2x3fv;
		PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC ProgramUniformMatrix3x2fv;
		PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC ProgramUniformMatrix2x4fv;
		PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC ProgramUniformMatrix4x2fv;
		PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC ProgramUniformMatrix3x4fv;
		PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC ProgramUniformMatrix4x3fv;
		PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC ProgramUniformMatrix2x3dv;
		PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC ProgramUniformMatrix3x2dv;
		PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC ProgramUniformMatrix2x4dv;
		PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC ProgramUniformMatrix4x2dv;
		PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC ProgramUniformMatrix3x4dv;
		PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC ProgramUniformMatrix4x3dv;
		PFNGLVALIDATEPROGRAMPIPELINEPROC ValidateProgramPipeline;
		PFNGLGETPROGRAMPIPELINEINFOLOGPROC GetProgramPipelineInfoLog;
		PFNGLVERTEXATTRIBL1DPROC VertexAttribL1d;
		PFNGLVERTEXATTRIBL2DPROC VertexAttribL2d;
		PFNGLVERTEXATTRIBL3DPROC VertexAttribL3d;
		PFNGLVERTEXATTRIBL4DPROC VertexAttribL4d;
		PFNGLVERTEXATTRIBL1DVPROC VertexAttribL1dv;
		PFNGLVERTEXATTRIBL2DVPROC VertexAttribL2dv;
		PFNGLVERTEXATTRIBL3DVPROC VertexAttribL3dv;
		PFNGLVERTEXATTRIBL4DVPROC VertexAttribL4dv;
		PFNGLVERTEXATTRIBLPOINTERPROC VertexAttribLPointer;
		PFNGLGETVERTEXATTRIBLDVPROC GetVertexAttribLdv;
		PFNGLVIEWPORTARRAYVPROC ViewportArrayv;
		PFNGLVIEWPORTINDEXEDFPROC ViewportIndexedf;
		PFNGLVIEWPORTINDEXEDFVPROC ViewportIndexedfv;
		PFNGLSCISSORARRAYVPROC ScissorArrayv;
		PFNGLSCISSORINDEXEDPROC ScissorIndexed;
		PFNGLSCISSORINDEXEDVPROC ScissorIndexedv;
		PFNGLDEPTHRANGEARRAYVPROC DepthRangeArrayv;
		PFNGLDEPTHRANGEINDEXEDPROC DepthRangeIndexed;
		PFNGLGETFLOATI_VPROC GetFloati_v;
		PFNGLGETDOUBLEI_VPROC GetDoublei_v;

		inline void ProgramUniformi(GLuint program, GLint location, GLint v0) const { ProgramUniform1i(program, location, v0);}
		inline void ProgramUniformf(GLuint program, GLint location, GLfloat v0) const { ProgramUniform1f(program, location, v0);}
		inline void ProgramUniformd(GLuint program, GLint location, GLdouble v0) const { ProgramUniform1d(program, location, v0);}
		inline void ProgramUniformui(GLuint program, GLint location, GLuint v0) const { ProgramUniform1ui(program, location, v0);}
		inline void ProgramUniformi(GLuint program, GLint location, GLint v0, GLint v1) const { ProgramUniform2i(program, location, v0, v1);}
		inline void ProgramUniformf(GLuint program, GLint location, GLfloat v0, GLfloat v1) const { ProgramUniform2f(program, location, v0, v1);}
		inline void ProgramUniformd(GLuint program, GLint location, GLdouble v0, GLdouble v1) const { ProgramUniform2d(program, location, v0, v1);}
		inline void ProgramUniformui(GLuint program, GLint location, GLuint v0, GLuint v1) const { ProgramUniform2ui(program, location, v0, v1);}
		inline void ProgramUniformi(GLuint program, GLint location, GLint v0, GLint v1, GLint v2) const { ProgramUniform3i(program, location, v0, v1, v2);}
		inline void ProgramUniformf(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) const { ProgramUniform3f(program, location, v0, v1, v2);}
		inline void ProgramUniformd(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2) const { ProgramUniform3d(program, location, v0, v1, v2);}
		inline void ProgramUniformui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2) const { ProgramUniform3ui(program, location, v0, v1, v2);}
		inline void ProgramUniformi(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3) const { ProgramUniform4i(program, location, v0, v1, v2, v3);}
		inline void ProgramUniformf(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) const { ProgramUniform4f(program, location, v0, v1, v2, v3);}
		inline void ProgramUniformd(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3) const { ProgramUniform4d(program, location, v0, v1, v2, v3);}
		inline void ProgramUniformui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) const { ProgramUniform4ui(program, location, v0, v1, v2, v3);}
		inline void VertexAttribLd(GLuint index, GLdouble x) const { VertexAttribL1d(index, x);}
		inline void VertexAttribLd(GLuint index, GLdouble x, GLdouble y) const { VertexAttribL2d(index, x, y);}
		inline void VertexAttribLd(GLuint index, GLdouble x, GLdouble y, GLdouble z) const { VertexAttribL3d(index, x, y, z);}
		inline void VertexAttribLd(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) const { VertexAttribL4d(index, x, y, z, w);}
	};

	class Version42 : public Version41
	{
	protected:
		using PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC = void (APIENTRYP) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
		using PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC = void (APIENTRYP) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount, GLuint baseinstance);
		using PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC = void (APIENTRYP) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
		using PFNGLGETINTERNALFORMATIVPROC = void (APIENTRYP) (GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint* params);
		using PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC = void (APIENTRYP) (GLuint program, GLuint bufferIndex, GLenum pname, GLint* params);
		using PFNGLBINDIMAGETEXTUREPROC = void (APIENTRYP) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
		using PFNGLMEMORYBARRIERPROC = void (APIENTRYP) (GLbitfield barriers);
		using PFNGLTEXSTORAGE1DPROC = void (APIENTRYP) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
		using PFNGLTEXSTORAGE2DPROC = void (APIENTRYP) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
		using PFNGLTEXSTORAGE3DPROC = void (APIENTRYP) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
		using PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC = void (APIENTRYP) (GLenum mode, GLuint id, GLsizei instancecount);
		using PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC = void (APIENTRYP) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);

	private:
		bool Available;

	public:
		Version42() = delete;
		Version42(Func_GetProcAddress GetProcAddress);
		inline bool Version42IsAvailable() { return Available; }

		static constexpr GLenum COPY_READ_BUFFER_BINDING = 0x8F36;
		static constexpr GLenum COPY_WRITE_BUFFER_BINDING = 0x8F37;
		static constexpr GLenum TRANSFORM_FEEDBACK_ACTIVE = 0x8E24;
		static constexpr GLenum TRANSFORM_FEEDBACK_PAUSED = 0x8E23;
		static constexpr GLenum UNPACK_COMPRESSED_BLOCK_WIDTH = 0x9127;
		static constexpr GLenum UNPACK_COMPRESSED_BLOCK_HEIGHT = 0x9128;
		static constexpr GLenum UNPACK_COMPRESSED_BLOCK_DEPTH = 0x9129;
		static constexpr GLenum UNPACK_COMPRESSED_BLOCK_SIZE = 0x912A;
		static constexpr GLenum PACK_COMPRESSED_BLOCK_WIDTH = 0x912B;
		static constexpr GLenum PACK_COMPRESSED_BLOCK_HEIGHT = 0x912C;
		static constexpr GLenum PACK_COMPRESSED_BLOCK_DEPTH = 0x912D;
		static constexpr GLenum PACK_COMPRESSED_BLOCK_SIZE = 0x912E;
		static constexpr GLenum NUM_SAMPLE_COUNTS = 0x9380;
		static constexpr GLenum MIN_MAP_BUFFER_ALIGNMENT = 0x90BC;
		static constexpr GLenum ATOMIC_COUNTER_BUFFER = 0x92C0;
		static constexpr GLenum ATOMIC_COUNTER_BUFFER_BINDING = 0x92C1;
		static constexpr GLenum ATOMIC_COUNTER_BUFFER_START = 0x92C2;
		static constexpr GLenum ATOMIC_COUNTER_BUFFER_SIZE = 0x92C3;
		static constexpr GLenum ATOMIC_COUNTER_BUFFER_DATA_SIZE = 0x92C4;
		static constexpr GLenum ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS = 0x92C5;
		static constexpr GLenum ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES = 0x92C6;
		static constexpr GLenum ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER = 0x92C7;
		static constexpr GLenum ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER = 0x92C8;
		static constexpr GLenum ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x92C9;
		static constexpr GLenum ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER = 0x92CA;
		static constexpr GLenum ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER = 0x92CB;
		static constexpr GLenum MAX_VERTEX_ATOMIC_COUNTER_BUFFERS = 0x92CC;
		static constexpr GLenum MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS = 0x92CD;
		static constexpr GLenum MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS = 0x92CE;
		static constexpr GLenum MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS = 0x92CF;
		static constexpr GLenum MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS = 0x92D0;
		static constexpr GLenum MAX_COMBINED_ATOMIC_COUNTER_BUFFERS = 0x92D1;
		static constexpr GLenum MAX_VERTEX_ATOMIC_COUNTERS = 0x92D2;
		static constexpr GLenum MAX_TESS_CONTROL_ATOMIC_COUNTERS = 0x92D3;
		static constexpr GLenum MAX_TESS_EVALUATION_ATOMIC_COUNTERS = 0x92D4;
		static constexpr GLenum MAX_GEOMETRY_ATOMIC_COUNTERS = 0x92D5;
		static constexpr GLenum MAX_FRAGMENT_ATOMIC_COUNTERS = 0x92D6;
		static constexpr GLenum MAX_COMBINED_ATOMIC_COUNTERS = 0x92D7;
		static constexpr GLenum MAX_ATOMIC_COUNTER_BUFFER_SIZE = 0x92D8;
		static constexpr GLenum MAX_ATOMIC_COUNTER_BUFFER_BINDINGS = 0x92DC;
		static constexpr GLenum ACTIVE_ATOMIC_COUNTER_BUFFERS = 0x92D9;
		static constexpr GLenum UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX = 0x92DA;
		static constexpr GLenum UNSIGNED_INT_ATOMIC_COUNTER = 0x92DB;
		static constexpr GLbitfield VERTEX_ATTRIB_ARRAY_BARRIER_BIT = 0x00000001;
		static constexpr GLbitfield ELEMENT_ARRAY_BARRIER_BIT = 0x00000002;
		static constexpr GLbitfield UNIFORM_BARRIER_BIT = 0x00000004;
		static constexpr GLbitfield TEXTURE_FETCH_BARRIER_BIT = 0x00000008;
		static constexpr GLbitfield SHADER_IMAGE_ACCESS_BARRIER_BIT = 0x00000020;
		static constexpr GLbitfield COMMAND_BARRIER_BIT = 0x00000040;
		static constexpr GLbitfield PIXEL_BUFFER_BARRIER_BIT = 0x00000080;
		static constexpr GLbitfield TEXTURE_UPDATE_BARRIER_BIT = 0x00000100;
		static constexpr GLbitfield BUFFER_UPDATE_BARRIER_BIT = 0x00000200;
		static constexpr GLbitfield FRAMEBUFFER_BARRIER_BIT = 0x00000400;
		static constexpr GLbitfield TRANSFORM_FEEDBACK_BARRIER_BIT = 0x00000800;
		static constexpr GLbitfield ATOMIC_COUNTER_BARRIER_BIT = 0x00001000;
		static constexpr GLbitfield ALL_BARRIER_BITS = 0xFFFFFFFF;
		static constexpr GLenum MAX_IMAGE_UNITS = 0x8F38;
		static constexpr GLenum MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS = 0x8F39;
		static constexpr GLenum IMAGE_BINDING_NAME = 0x8F3A;
		static constexpr GLenum IMAGE_BINDING_LEVEL = 0x8F3B;
		static constexpr GLenum IMAGE_BINDING_LAYERED = 0x8F3C;
		static constexpr GLenum IMAGE_BINDING_LAYER = 0x8F3D;
		static constexpr GLenum IMAGE_BINDING_ACCESS = 0x8F3E;
		static constexpr GLenum IMAGE_1D = 0x904C;
		static constexpr GLenum IMAGE_2D = 0x904D;
		static constexpr GLenum IMAGE_3D = 0x904E;
		static constexpr GLenum IMAGE_2D_RECT = 0x904F;
		static constexpr GLenum IMAGE_CUBE = 0x9050;
		static constexpr GLenum IMAGE_BUFFER = 0x9051;
		static constexpr GLenum IMAGE_1D_ARRAY = 0x9052;
		static constexpr GLenum IMAGE_2D_ARRAY = 0x9053;
		static constexpr GLenum IMAGE_CUBE_MAP_ARRAY = 0x9054;
		static constexpr GLenum IMAGE_2D_MULTISAMPLE = 0x9055;
		static constexpr GLenum IMAGE_2D_MULTISAMPLE_ARRAY = 0x9056;
		static constexpr GLenum INT_IMAGE_1D = 0x9057;
		static constexpr GLenum INT_IMAGE_2D = 0x9058;
		static constexpr GLenum INT_IMAGE_3D = 0x9059;
		static constexpr GLenum INT_IMAGE_2D_RECT = 0x905A;
		static constexpr GLenum INT_IMAGE_CUBE = 0x905B;
		static constexpr GLenum INT_IMAGE_BUFFER = 0x905C;
		static constexpr GLenum INT_IMAGE_1D_ARRAY = 0x905D;
		static constexpr GLenum INT_IMAGE_2D_ARRAY = 0x905E;
		static constexpr GLenum INT_IMAGE_CUBE_MAP_ARRAY = 0x905F;
		static constexpr GLenum INT_IMAGE_2D_MULTISAMPLE = 0x9060;
		static constexpr GLenum INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x9061;
		static constexpr GLenum UNSIGNED_INT_IMAGE_1D = 0x9062;
		static constexpr GLenum UNSIGNED_INT_IMAGE_2D = 0x9063;
		static constexpr GLenum UNSIGNED_INT_IMAGE_3D = 0x9064;
		static constexpr GLenum UNSIGNED_INT_IMAGE_2D_RECT = 0x9065;
		static constexpr GLenum UNSIGNED_INT_IMAGE_CUBE = 0x9066;
		static constexpr GLenum UNSIGNED_INT_IMAGE_BUFFER = 0x9067;
		static constexpr GLenum UNSIGNED_INT_IMAGE_1D_ARRAY = 0x9068;
		static constexpr GLenum UNSIGNED_INT_IMAGE_2D_ARRAY = 0x9069;
		static constexpr GLenum UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY = 0x906A;
		static constexpr GLenum UNSIGNED_INT_IMAGE_2D_MULTISAMPLE = 0x906B;
		static constexpr GLenum UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x906C;
		static constexpr GLenum MAX_IMAGE_SAMPLES = 0x906D;
		static constexpr GLenum IMAGE_BINDING_FORMAT = 0x906E;
		static constexpr GLenum IMAGE_FORMAT_COMPATIBILITY_TYPE = 0x90C7;
		static constexpr GLenum IMAGE_FORMAT_COMPATIBILITY_BY_SIZE = 0x90C8;
		static constexpr GLenum IMAGE_FORMAT_COMPATIBILITY_BY_CLASS = 0x90C9;
		static constexpr GLenum MAX_VERTEX_IMAGE_UNIFORMS = 0x90CA;
		static constexpr GLenum MAX_TESS_CONTROL_IMAGE_UNIFORMS = 0x90CB;
		static constexpr GLenum MAX_TESS_EVALUATION_IMAGE_UNIFORMS = 0x90CC;
		static constexpr GLenum MAX_GEOMETRY_IMAGE_UNIFORMS = 0x90CD;
		static constexpr GLenum MAX_FRAGMENT_IMAGE_UNIFORMS = 0x90CE;
		static constexpr GLenum MAX_COMBINED_IMAGE_UNIFORMS = 0x90CF;
		static constexpr GLenum COMPRESSED_RGBA_BPTC_UNORM = 0x8E8C;
		static constexpr GLenum COMPRESSED_SRGB_ALPHA_BPTC_UNORM = 0x8E8D;
		static constexpr GLenum COMPRESSED_RGB_BPTC_SIGNED_FLOAT = 0x8E8E;
		static constexpr GLenum COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT = 0x8E8F;
		static constexpr GLenum TEXTURE_IMMUTABLE_FORMAT = 0x912F;

		PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC DrawArraysInstancedBaseInstance;
		PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC DrawElementsInstancedBaseInstance;
		PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC DrawElementsInstancedBaseVertexBaseInstance;
		PFNGLGETINTERNALFORMATIVPROC GetInternalformativ;
		PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC GetActiveAtomicCounterBufferiv;
		PFNGLBINDIMAGETEXTUREPROC BindImageTexture;
		PFNGLMEMORYBARRIERPROC MemoryBarrier;
		PFNGLTEXSTORAGE1DPROC TexStorage1D;
		PFNGLTEXSTORAGE2DPROC TexStorage2D;
		PFNGLTEXSTORAGE3DPROC TexStorage3D;
		PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC DrawTransformFeedbackInstanced;
		PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC DrawTransformFeedbackStreamInstanced;

	};
	using GLDEBUGPROC = void (APIENTRY*) (GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar* message,const void* userParam);

	class Version43 : public Version42
	{
	protected:
		using PFNGLCLEARBUFFERDATAPROC = void (APIENTRYP) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void* data);
		using PFNGLCLEARBUFFERSUBDATAPROC = void (APIENTRYP) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void* data);
		using PFNGLDISPATCHCOMPUTEPROC = void (APIENTRYP) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
		using PFNGLDISPATCHCOMPUTEINDIRECTPROC = void (APIENTRYP) (GLintptr indirect);
		using PFNGLCOPYIMAGESUBDATAPROC = void (APIENTRYP) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
		using PFNGLFRAMEBUFFERPARAMETERIPROC = void (APIENTRYP) (GLenum target, GLenum pname, GLint param);
		using PFNGLGETFRAMEBUFFERPARAMETERIVPROC = void (APIENTRYP) (GLenum target, GLenum pname, GLint* params);
		using PFNGLGETINTERNALFORMATI64VPROC = void (APIENTRYP) (GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint64* params);
		using PFNGLINVALIDATETEXSUBIMAGEPROC = void (APIENTRYP) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
		using PFNGLINVALIDATETEXIMAGEPROC = void (APIENTRYP) (GLuint texture, GLint level);
		using PFNGLINVALIDATEBUFFERSUBDATAPROC = void (APIENTRYP) (GLuint buffer, GLintptr offset, GLsizeiptr length);
		using PFNGLINVALIDATEBUFFERDATAPROC = void (APIENTRYP) (GLuint buffer);
		using PFNGLINVALIDATEFRAMEBUFFERPROC = void (APIENTRYP) (GLenum target, GLsizei numAttachments, const GLenum* attachments);
		using PFNGLINVALIDATESUBFRAMEBUFFERPROC = void (APIENTRYP) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height);
		using PFNGLMULTIDRAWARRAYSINDIRECTPROC = void (APIENTRYP) (GLenum mode, const void* indirect, GLsizei drawcount, GLsizei stride);
		using PFNGLMULTIDRAWELEMENTSINDIRECTPROC = void (APIENTRYP) (GLenum mode, GLenum type, const void* indirect, GLsizei drawcount, GLsizei stride);
		using PFNGLGETPROGRAMINTERFACEIVPROC = void (APIENTRYP) (GLuint program, GLenum programInterface, GLenum pname, GLint* params);
		using PFNGLGETPROGRAMRESOURCEINDEXPROC = GLuint (APIENTRYP) (GLuint program, GLenum programInterface, const GLchar* name);
		using PFNGLGETPROGRAMRESOURCENAMEPROC = void (APIENTRYP) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, GLchar* name);
		using PFNGLGETPROGRAMRESOURCEIVPROC = void (APIENTRYP) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei count, GLsizei* length, GLint* params);
		using PFNGLGETPROGRAMRESOURCELOCATIONPROC = GLint (APIENTRYP) (GLuint program, GLenum programInterface, const GLchar* name);
		using PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC = GLint (APIENTRYP) (GLuint program, GLenum programInterface, const GLchar* name);
		using PFNGLSHADERSTORAGEBLOCKBINDINGPROC = void (APIENTRYP) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);
		using PFNGLTEXBUFFERRANGEPROC = void (APIENTRYP) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
		using PFNGLTEXSTORAGE2DMULTISAMPLEPROC = void (APIENTRYP) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
		using PFNGLTEXSTORAGE3DMULTISAMPLEPROC = void (APIENTRYP) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
		using PFNGLTEXTUREVIEWPROC = void (APIENTRYP) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
		using PFNGLBINDVERTEXBUFFERPROC = void (APIENTRYP) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
		using PFNGLVERTEXATTRIBFORMATPROC = void (APIENTRYP) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
		using PFNGLVERTEXATTRIBIFORMATPROC = void (APIENTRYP) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
		using PFNGLVERTEXATTRIBLFORMATPROC = void (APIENTRYP) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
		using PFNGLVERTEXATTRIBBINDINGPROC = void (APIENTRYP) (GLuint attribindex, GLuint bindingindex);
		using PFNGLVERTEXBINDINGDIVISORPROC = void (APIENTRYP) (GLuint bindingindex, GLuint divisor);
		using PFNGLDEBUGMESSAGECONTROLPROC = void (APIENTRYP) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled);
		using PFNGLDEBUGMESSAGEINSERTPROC = void (APIENTRYP) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf);
		using PFNGLDEBUGMESSAGECALLBACKPROC = void (APIENTRYP) (GLDEBUGPROC callback, const void* userParam);
		using PFNGLGETDEBUGMESSAGELOGPROC = GLuint (APIENTRYP) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog);
		using PFNGLPUSHDEBUGGROUPPROC = void (APIENTRYP) (GLenum source, GLuint id, GLsizei length, const GLchar* message);
		using PFNGLPOPDEBUGGROUPPROC = void (APIENTRYP) (void);
		using PFNGLOBJECTLABELPROC = void (APIENTRYP) (GLenum identifier, GLuint name, GLsizei length, const GLchar* label);
		using PFNGLGETOBJECTLABELPROC = void (APIENTRYP) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar* label);
		using PFNGLOBJECTPTRLABELPROC = void (APIENTRYP) (const void* ptr, GLsizei length, const GLchar* label);
		using PFNGLGETOBJECTPTRLABELPROC = void (APIENTRYP) (const void* ptr, GLsizei bufSize, GLsizei* length, GLchar* label);

	private:
		bool Available;

	public:
		Version43() = delete;
		Version43(Func_GetProcAddress GetProcAddress);
		inline bool Version43IsAvailable() { return Available; }

		static constexpr GLenum NUM_SHADING_LANGUAGE_VERSIONS = 0x82E9;
		static constexpr GLenum VERTEX_ATTRIB_ARRAY_LONG = 0x874E;
		static constexpr GLenum COMPRESSED_RGB8_ETC2 = 0x9274;
		static constexpr GLenum COMPRESSED_SRGB8_ETC2 = 0x9275;
		static constexpr GLenum COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276;
		static constexpr GLenum COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277;
		static constexpr GLenum COMPRESSED_RGBA8_ETC2_EAC = 0x9278;
		static constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279;
		static constexpr GLenum COMPRESSED_R11_EAC = 0x9270;
		static constexpr GLenum COMPRESSED_SIGNED_R11_EAC = 0x9271;
		static constexpr GLenum COMPRESSED_RG11_EAC = 0x9272;
		static constexpr GLenum COMPRESSED_SIGNED_RG11_EAC = 0x9273;
		static constexpr GLenum PRIMITIVE_RESTART_FIXED_INDEX = 0x8D69;
		static constexpr GLenum ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8D6A;
		static constexpr GLenum MAX_ELEMENT_INDEX = 0x8D6B;
		static constexpr GLenum COMPUTE_SHADER = 0x91B9;
		static constexpr GLenum MAX_COMPUTE_UNIFORM_BLOCKS = 0x91BB;
		static constexpr GLenum MAX_COMPUTE_TEXTURE_IMAGE_UNITS = 0x91BC;
		static constexpr GLenum MAX_COMPUTE_IMAGE_UNIFORMS = 0x91BD;
		static constexpr GLenum MAX_COMPUTE_SHARED_MEMORY_SIZE = 0x8262;
		static constexpr GLenum MAX_COMPUTE_UNIFORM_COMPONENTS = 0x8263;
		static constexpr GLenum MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS = 0x8264;
		static constexpr GLenum MAX_COMPUTE_ATOMIC_COUNTERS = 0x8265;
		static constexpr GLenum MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS = 0x8266;
		static constexpr GLenum MAX_COMPUTE_WORK_GROUP_INVOCATIONS = 0x90EB;
		static constexpr GLenum MAX_COMPUTE_WORK_GROUP_COUNT = 0x91BE;
		static constexpr GLenum MAX_COMPUTE_WORK_GROUP_SIZE = 0x91BF;
		static constexpr GLenum COMPUTE_WORK_GROUP_SIZE = 0x8267;
		static constexpr GLenum UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER = 0x90EC;
		static constexpr GLenum ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER = 0x90ED;
		static constexpr GLenum DISPATCH_INDIRECT_BUFFER = 0x90EE;
		static constexpr GLenum DISPATCH_INDIRECT_BUFFER_BINDING = 0x90EF;
		static constexpr GLbitfield COMPUTE_SHADER_BIT = 0x00000020;
		static constexpr GLenum DEBUG_OUTPUT_SYNCHRONOUS = 0x8242;
		static constexpr GLenum DEBUG_NEXT_LOGGED_MESSAGE_LENGTH = 0x8243;
		static constexpr GLenum DEBUG_CALLBACK_FUNCTION = 0x8244;
		static constexpr GLenum DEBUG_CALLBACK_USER_PARAM = 0x8245;
		static constexpr GLenum DEBUG_SOURCE_API = 0x8246;
		static constexpr GLenum DEBUG_SOURCE_WINDOW_SYSTEM = 0x8247;
		static constexpr GLenum DEBUG_SOURCE_SHADER_COMPILER = 0x8248;
		static constexpr GLenum DEBUG_SOURCE_THIRD_PARTY = 0x8249;
		static constexpr GLenum DEBUG_SOURCE_APPLICATION = 0x824A;
		static constexpr GLenum DEBUG_SOURCE_OTHER = 0x824B;
		static constexpr GLenum DEBUG_TYPE_ERROR = 0x824C;
		static constexpr GLenum DEBUG_TYPE_DEPRECATED_BEHAVIOR = 0x824D;
		static constexpr GLenum DEBUG_TYPE_UNDEFINED_BEHAVIOR = 0x824E;
		static constexpr GLenum DEBUG_TYPE_PORTABILITY = 0x824F;
		static constexpr GLenum DEBUG_TYPE_PERFORMANCE = 0x8250;
		static constexpr GLenum DEBUG_TYPE_OTHER = 0x8251;
		static constexpr GLenum MAX_DEBUG_MESSAGE_LENGTH = 0x9143;
		static constexpr GLenum MAX_DEBUG_LOGGED_MESSAGES = 0x9144;
		static constexpr GLenum DEBUG_LOGGED_MESSAGES = 0x9145;
		static constexpr GLenum DEBUG_SEVERITY_HIGH = 0x9146;
		static constexpr GLenum DEBUG_SEVERITY_MEDIUM = 0x9147;
		static constexpr GLenum DEBUG_SEVERITY_LOW = 0x9148;
		static constexpr GLenum DEBUG_TYPE_MARKER = 0x8268;
		static constexpr GLenum DEBUG_TYPE_PUSH_GROUP = 0x8269;
		static constexpr GLenum DEBUG_TYPE_POP_GROUP = 0x826A;
		static constexpr GLenum DEBUG_SEVERITY_NOTIFICATION = 0x826B;
		static constexpr GLenum MAX_DEBUG_GROUP_STACK_DEPTH = 0x826C;
		static constexpr GLenum DEBUG_GROUP_STACK_DEPTH = 0x826D;
		static constexpr GLenum BUFFER = 0x82E0;
		static constexpr GLenum SHADER = 0x82E1;
		static constexpr GLenum PROGRAM = 0x82E2;
		static constexpr GLenum QUERY = 0x82E3;
		static constexpr GLenum PROGRAM_PIPELINE = 0x82E4;
		static constexpr GLenum SAMPLER = 0x82E6;
		static constexpr GLenum MAX_LABEL_LENGTH = 0x82E8;
		static constexpr GLenum DEBUG_OUTPUT = 0x92E0;
		static constexpr GLbitfield CONTEXT_FLAG_DEBUG_BIT = 0x00000002;
		static constexpr GLenum MAX_UNIFORM_LOCATIONS = 0x826E;
		static constexpr GLenum FRAMEBUFFER_DEFAULT_WIDTH = 0x9310;
		static constexpr GLenum FRAMEBUFFER_DEFAULT_HEIGHT = 0x9311;
		static constexpr GLenum FRAMEBUFFER_DEFAULT_LAYERS = 0x9312;
		static constexpr GLenum FRAMEBUFFER_DEFAULT_SAMPLES = 0x9313;
		static constexpr GLenum FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS = 0x9314;
		static constexpr GLenum MAX_FRAMEBUFFER_WIDTH = 0x9315;
		static constexpr GLenum MAX_FRAMEBUFFER_HEIGHT = 0x9316;
		static constexpr GLenum MAX_FRAMEBUFFER_LAYERS = 0x9317;
		static constexpr GLenum MAX_FRAMEBUFFER_SAMPLES = 0x9318;
		static constexpr GLenum INTERNALFORMAT_SUPPORTED = 0x826F;
		static constexpr GLenum INTERNALFORMAT_PREFERRED = 0x8270;
		static constexpr GLenum INTERNALFORMAT_RED_SIZE = 0x8271;
		static constexpr GLenum INTERNALFORMAT_GREEN_SIZE = 0x8272;
		static constexpr GLenum INTERNALFORMAT_BLUE_SIZE = 0x8273;
		static constexpr GLenum INTERNALFORMAT_ALPHA_SIZE = 0x8274;
		static constexpr GLenum INTERNALFORMAT_DEPTH_SIZE = 0x8275;
		static constexpr GLenum INTERNALFORMAT_STENCIL_SIZE = 0x8276;
		static constexpr GLenum INTERNALFORMAT_SHARED_SIZE = 0x8277;
		static constexpr GLenum INTERNALFORMAT_RED_TYPE = 0x8278;
		static constexpr GLenum INTERNALFORMAT_GREEN_TYPE = 0x8279;
		static constexpr GLenum INTERNALFORMAT_BLUE_TYPE = 0x827A;
		static constexpr GLenum INTERNALFORMAT_ALPHA_TYPE = 0x827B;
		static constexpr GLenum INTERNALFORMAT_DEPTH_TYPE = 0x827C;
		static constexpr GLenum INTERNALFORMAT_STENCIL_TYPE = 0x827D;
		static constexpr GLenum MAX_WIDTH = 0x827E;
		static constexpr GLenum MAX_HEIGHT = 0x827F;
		static constexpr GLenum MAX_DEPTH = 0x8280;
		static constexpr GLenum MAX_LAYERS = 0x8281;
		static constexpr GLenum MAX_COMBINED_DIMENSIONS = 0x8282;
		static constexpr GLenum COLOR_COMPONENTS = 0x8283;
		static constexpr GLenum DEPTH_COMPONENTS = 0x8284;
		static constexpr GLenum STENCIL_COMPONENTS = 0x8285;
		static constexpr GLenum COLOR_RENDERABLE = 0x8286;
		static constexpr GLenum DEPTH_RENDERABLE = 0x8287;
		static constexpr GLenum STENCIL_RENDERABLE = 0x8288;
		static constexpr GLenum FRAMEBUFFER_RENDERABLE = 0x8289;
		static constexpr GLenum FRAMEBUFFER_RENDERABLE_LAYERED = 0x828A;
		static constexpr GLenum FRAMEBUFFER_BLEND = 0x828B;
		static constexpr GLenum READ_PIXELS = 0x828C;
		static constexpr GLenum READ_PIXELS_FORMAT = 0x828D;
		static constexpr GLenum READ_PIXELS_TYPE = 0x828E;
		static constexpr GLenum TEXTURE_IMAGE_FORMAT = 0x828F;
		static constexpr GLenum TEXTURE_IMAGE_TYPE = 0x8290;
		static constexpr GLenum GET_TEXTURE_IMAGE_FORMAT = 0x8291;
		static constexpr GLenum GET_TEXTURE_IMAGE_TYPE = 0x8292;
		static constexpr GLenum MIPMAP = 0x8293;
		static constexpr GLenum MANUAL_GENERATE_MIPMAP = 0x8294;
		static constexpr GLenum AUTO_GENERATE_MIPMAP = 0x8295;
		static constexpr GLenum COLOR_ENCODING = 0x8296;
		static constexpr GLenum SRGB_READ = 0x8297;
		static constexpr GLenum SRGB_WRITE = 0x8298;
		static constexpr GLenum FILTER = 0x829A;
		static constexpr GLenum VERTEX_TEXTURE = 0x829B;
		static constexpr GLenum TESS_CONTROL_TEXTURE = 0x829C;
		static constexpr GLenum TESS_EVALUATION_TEXTURE = 0x829D;
		static constexpr GLenum GEOMETRY_TEXTURE = 0x829E;
		static constexpr GLenum FRAGMENT_TEXTURE = 0x829F;
		static constexpr GLenum COMPUTE_TEXTURE = 0x82A0;
		static constexpr GLenum TEXTURE_SHADOW = 0x82A1;
		static constexpr GLenum TEXTURE_GATHER = 0x82A2;
		static constexpr GLenum TEXTURE_GATHER_SHADOW = 0x82A3;
		static constexpr GLenum SHADER_IMAGE_LOAD = 0x82A4;
		static constexpr GLenum SHADER_IMAGE_STORE = 0x82A5;
		static constexpr GLenum SHADER_IMAGE_ATOMIC = 0x82A6;
		static constexpr GLenum IMAGE_TEXEL_SIZE = 0x82A7;
		static constexpr GLenum IMAGE_COMPATIBILITY_CLASS = 0x82A8;
		static constexpr GLenum IMAGE_PIXEL_FORMAT = 0x82A9;
		static constexpr GLenum IMAGE_PIXEL_TYPE = 0x82AA;
		static constexpr GLenum SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST = 0x82AC;
		static constexpr GLenum SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST = 0x82AD;
		static constexpr GLenum SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE = 0x82AE;
		static constexpr GLenum SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE = 0x82AF;
		static constexpr GLenum TEXTURE_COMPRESSED_BLOCK_WIDTH = 0x82B1;
		static constexpr GLenum TEXTURE_COMPRESSED_BLOCK_HEIGHT = 0x82B2;
		static constexpr GLenum TEXTURE_COMPRESSED_BLOCK_SIZE = 0x82B3;
		static constexpr GLenum CLEAR_BUFFER = 0x82B4;
		static constexpr GLenum TEXTURE_VIEW = 0x82B5;
		static constexpr GLenum VIEW_COMPATIBILITY_CLASS = 0x82B6;
		static constexpr GLenum FULL_SUPPORT = 0x82B7;
		static constexpr GLenum CAVEAT_SUPPORT = 0x82B8;
		static constexpr GLenum IMAGE_CLASS_4_X_32 = 0x82B9;
		static constexpr GLenum IMAGE_CLASS_2_X_32 = 0x82BA;
		static constexpr GLenum IMAGE_CLASS_1_X_32 = 0x82BB;
		static constexpr GLenum IMAGE_CLASS_4_X_16 = 0x82BC;
		static constexpr GLenum IMAGE_CLASS_2_X_16 = 0x82BD;
		static constexpr GLenum IMAGE_CLASS_1_X_16 = 0x82BE;
		static constexpr GLenum IMAGE_CLASS_4_X_8 = 0x82BF;
		static constexpr GLenum IMAGE_CLASS_2_X_8 = 0x82C0;
		static constexpr GLenum IMAGE_CLASS_1_X_8 = 0x82C1;
		static constexpr GLenum IMAGE_CLASS_11_11_10 = 0x82C2;
		static constexpr GLenum IMAGE_CLASS_10_10_10_2 = 0x82C3;
		static constexpr GLenum VIEW_CLASS_128_BITS = 0x82C4;
		static constexpr GLenum VIEW_CLASS_96_BITS = 0x82C5;
		static constexpr GLenum VIEW_CLASS_64_BITS = 0x82C6;
		static constexpr GLenum VIEW_CLASS_48_BITS = 0x82C7;
		static constexpr GLenum VIEW_CLASS_32_BITS = 0x82C8;
		static constexpr GLenum VIEW_CLASS_24_BITS = 0x82C9;
		static constexpr GLenum VIEW_CLASS_16_BITS = 0x82CA;
		static constexpr GLenum VIEW_CLASS_8_BITS = 0x82CB;
		static constexpr GLenum VIEW_CLASS_S3TC_DXT1_RGB = 0x82CC;
		static constexpr GLenum VIEW_CLASS_S3TC_DXT1_RGBA = 0x82CD;
		static constexpr GLenum VIEW_CLASS_S3TC_DXT3_RGBA = 0x82CE;
		static constexpr GLenum VIEW_CLASS_S3TC_DXT5_RGBA = 0x82CF;
		static constexpr GLenum VIEW_CLASS_RGTC1_RED = 0x82D0;
		static constexpr GLenum VIEW_CLASS_RGTC2_RG = 0x82D1;
		static constexpr GLenum VIEW_CLASS_BPTC_UNORM = 0x82D2;
		static constexpr GLenum VIEW_CLASS_BPTC_FLOAT = 0x82D3;
		static constexpr GLenum UNIFORM = 0x92E1;
		static constexpr GLenum UNIFORM_BLOCK = 0x92E2;
		static constexpr GLenum PROGRAM_INPUT = 0x92E3;
		static constexpr GLenum PROGRAM_OUTPUT = 0x92E4;
		static constexpr GLenum BUFFER_VARIABLE = 0x92E5;
		static constexpr GLenum SHADER_STORAGE_BLOCK = 0x92E6;
		static constexpr GLenum VERTEX_SUBROUTINE = 0x92E8;
		static constexpr GLenum TESS_CONTROL_SUBROUTINE = 0x92E9;
		static constexpr GLenum TESS_EVALUATION_SUBROUTINE = 0x92EA;
		static constexpr GLenum GEOMETRY_SUBROUTINE = 0x92EB;
		static constexpr GLenum FRAGMENT_SUBROUTINE = 0x92EC;
		static constexpr GLenum COMPUTE_SUBROUTINE = 0x92ED;
		static constexpr GLenum VERTEX_SUBROUTINE_UNIFORM = 0x92EE;
		static constexpr GLenum TESS_CONTROL_SUBROUTINE_UNIFORM = 0x92EF;
		static constexpr GLenum TESS_EVALUATION_SUBROUTINE_UNIFORM = 0x92F0;
		static constexpr GLenum GEOMETRY_SUBROUTINE_UNIFORM = 0x92F1;
		static constexpr GLenum FRAGMENT_SUBROUTINE_UNIFORM = 0x92F2;
		static constexpr GLenum COMPUTE_SUBROUTINE_UNIFORM = 0x92F3;
		static constexpr GLenum TRANSFORM_FEEDBACK_VARYING = 0x92F4;
		static constexpr GLenum ACTIVE_RESOURCES = 0x92F5;
		static constexpr GLenum MAX_NAME_LENGTH = 0x92F6;
		static constexpr GLenum MAX_NUM_ACTIVE_VARIABLES = 0x92F7;
		static constexpr GLenum MAX_NUM_COMPATIBLE_SUBROUTINES = 0x92F8;
		static constexpr GLenum NAME_LENGTH = 0x92F9;
		static constexpr GLenum TYPE = 0x92FA;
		static constexpr GLenum ARRAY_SIZE = 0x92FB;
		static constexpr GLenum OFFSET = 0x92FC;
		static constexpr GLenum BLOCK_INDEX = 0x92FD;
		static constexpr GLenum ARRAY_STRIDE = 0x92FE;
		static constexpr GLenum MATRIX_STRIDE = 0x92FF;
		static constexpr GLenum IS_ROW_MAJOR = 0x9300;
		static constexpr GLenum ATOMIC_COUNTER_BUFFER_INDEX = 0x9301;
		static constexpr GLenum BUFFER_BINDING = 0x9302;
		static constexpr GLenum BUFFER_DATA_SIZE = 0x9303;
		static constexpr GLenum NUM_ACTIVE_VARIABLES = 0x9304;
		static constexpr GLenum ACTIVE_VARIABLES = 0x9305;
		static constexpr GLenum REFERENCED_BY_VERTEX_SHADER = 0x9306;
		static constexpr GLenum REFERENCED_BY_TESS_CONTROL_SHADER = 0x9307;
		static constexpr GLenum REFERENCED_BY_TESS_EVALUATION_SHADER = 0x9308;
		static constexpr GLenum REFERENCED_BY_GEOMETRY_SHADER = 0x9309;
		static constexpr GLenum REFERENCED_BY_FRAGMENT_SHADER = 0x930A;
		static constexpr GLenum REFERENCED_BY_COMPUTE_SHADER = 0x930B;
		static constexpr GLenum TOP_LEVEL_ARRAY_SIZE = 0x930C;
		static constexpr GLenum TOP_LEVEL_ARRAY_STRIDE = 0x930D;
		static constexpr GLenum LOCATION = 0x930E;
		static constexpr GLenum LOCATION_INDEX = 0x930F;
		static constexpr GLenum IS_PER_PATCH = 0x92E7;
		static constexpr GLenum SHADER_STORAGE_BUFFER = 0x90D2;
		static constexpr GLenum SHADER_STORAGE_BUFFER_BINDING = 0x90D3;
		static constexpr GLenum SHADER_STORAGE_BUFFER_START = 0x90D4;
		static constexpr GLenum SHADER_STORAGE_BUFFER_SIZE = 0x90D5;
		static constexpr GLenum MAX_VERTEX_SHADER_STORAGE_BLOCKS = 0x90D6;
		static constexpr GLenum MAX_GEOMETRY_SHADER_STORAGE_BLOCKS = 0x90D7;
		static constexpr GLenum MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS = 0x90D8;
		static constexpr GLenum MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS = 0x90D9;
		static constexpr GLenum MAX_FRAGMENT_SHADER_STORAGE_BLOCKS = 0x90DA;
		static constexpr GLenum MAX_COMPUTE_SHADER_STORAGE_BLOCKS = 0x90DB;
		static constexpr GLenum MAX_COMBINED_SHADER_STORAGE_BLOCKS = 0x90DC;
		static constexpr GLenum MAX_SHADER_STORAGE_BUFFER_BINDINGS = 0x90DD;
		static constexpr GLenum MAX_SHADER_STORAGE_BLOCK_SIZE = 0x90DE;
		static constexpr GLenum SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT = 0x90DF;
		static constexpr GLbitfield SHADER_STORAGE_BARRIER_BIT = 0x00002000;
		static constexpr GLenum MAX_COMBINED_SHADER_OUTPUT_RESOURCES = 0x8F39;
		static constexpr GLenum DEPTH_STENCIL_TEXTURE_MODE = 0x90EA;
		static constexpr GLenum TEXTURE_BUFFER_OFFSET = 0x919D;
		static constexpr GLenum TEXTURE_BUFFER_SIZE = 0x919E;
		static constexpr GLenum TEXTURE_BUFFER_OFFSET_ALIGNMENT = 0x919F;
		static constexpr GLenum TEXTURE_VIEW_MIN_LEVEL = 0x82DB;
		static constexpr GLenum TEXTURE_VIEW_NUM_LEVELS = 0x82DC;
		static constexpr GLenum TEXTURE_VIEW_MIN_LAYER = 0x82DD;
		static constexpr GLenum TEXTURE_VIEW_NUM_LAYERS = 0x82DE;
		static constexpr GLenum TEXTURE_IMMUTABLE_LEVELS = 0x82DF;
		static constexpr GLenum VERTEX_ATTRIB_BINDING = 0x82D4;
		static constexpr GLenum VERTEX_ATTRIB_RELATIVE_OFFSET = 0x82D5;
		static constexpr GLenum VERTEX_BINDING_DIVISOR = 0x82D6;
		static constexpr GLenum VERTEX_BINDING_OFFSET = 0x82D7;
		static constexpr GLenum VERTEX_BINDING_STRIDE = 0x82D8;
		static constexpr GLenum MAX_VERTEX_ATTRIB_RELATIVE_OFFSET = 0x82D9;
		static constexpr GLenum MAX_VERTEX_ATTRIB_BINDINGS = 0x82DA;
		static constexpr GLenum VERTEX_BINDING_BUFFER = 0x8F4F;
		static constexpr GLenum DISPLAY_LIST = 0x82E7;

		PFNGLCLEARBUFFERDATAPROC ClearBufferData;
		PFNGLCLEARBUFFERSUBDATAPROC ClearBufferSubData;
		PFNGLDISPATCHCOMPUTEPROC DispatchCompute;
		PFNGLDISPATCHCOMPUTEINDIRECTPROC DispatchComputeIndirect;
		PFNGLCOPYIMAGESUBDATAPROC CopyImageSubData;
		PFNGLFRAMEBUFFERPARAMETERIPROC FramebufferParameteri;
		PFNGLGETFRAMEBUFFERPARAMETERIVPROC GetFramebufferParameteriv;
		PFNGLGETINTERNALFORMATI64VPROC GetInternalformati64v;
		PFNGLINVALIDATETEXSUBIMAGEPROC InvalidateTexSubImage;
		PFNGLINVALIDATETEXIMAGEPROC InvalidateTexImage;
		PFNGLINVALIDATEBUFFERSUBDATAPROC InvalidateBufferSubData;
		PFNGLINVALIDATEBUFFERDATAPROC InvalidateBufferData;
		PFNGLINVALIDATEFRAMEBUFFERPROC InvalidateFramebuffer;
		PFNGLINVALIDATESUBFRAMEBUFFERPROC InvalidateSubFramebuffer;
		PFNGLMULTIDRAWARRAYSINDIRECTPROC MultiDrawArraysIndirect;
		PFNGLMULTIDRAWELEMENTSINDIRECTPROC MultiDrawElementsIndirect;
		PFNGLGETPROGRAMINTERFACEIVPROC GetProgramInterfaceiv;
		PFNGLGETPROGRAMRESOURCEINDEXPROC GetProgramResourceIndex;
		PFNGLGETPROGRAMRESOURCENAMEPROC GetProgramResourceName;
		PFNGLGETPROGRAMRESOURCEIVPROC GetProgramResourceiv;
		PFNGLGETPROGRAMRESOURCELOCATIONPROC GetProgramResourceLocation;
		PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC GetProgramResourceLocationIndex;
		PFNGLSHADERSTORAGEBLOCKBINDINGPROC ShaderStorageBlockBinding;
		PFNGLTEXBUFFERRANGEPROC TexBufferRange;
		PFNGLTEXSTORAGE2DMULTISAMPLEPROC TexStorage2DMultisample;
		PFNGLTEXSTORAGE3DMULTISAMPLEPROC TexStorage3DMultisample;
		PFNGLTEXTUREVIEWPROC TextureView;
		PFNGLBINDVERTEXBUFFERPROC BindVertexBuffer;
		PFNGLVERTEXATTRIBFORMATPROC VertexAttribFormat;
		PFNGLVERTEXATTRIBIFORMATPROC VertexAttribIFormat;
		PFNGLVERTEXATTRIBLFORMATPROC VertexAttribLFormat;
		PFNGLVERTEXATTRIBBINDINGPROC VertexAttribBinding;
		PFNGLVERTEXBINDINGDIVISORPROC VertexBindingDivisor;
		PFNGLDEBUGMESSAGECONTROLPROC DebugMessageControl;
		PFNGLDEBUGMESSAGEINSERTPROC DebugMessageInsert;
		PFNGLDEBUGMESSAGECALLBACKPROC DebugMessageCallback;
		PFNGLGETDEBUGMESSAGELOGPROC GetDebugMessageLog;
		PFNGLPUSHDEBUGGROUPPROC PushDebugGroup;
		PFNGLPOPDEBUGGROUPPROC PopDebugGroup;
		PFNGLOBJECTLABELPROC ObjectLabel;
		PFNGLGETOBJECTLABELPROC GetObjectLabel;
		PFNGLOBJECTPTRLABELPROC ObjectPtrLabel;
		PFNGLGETOBJECTPTRLABELPROC GetObjectPtrLabel;

	};

	class Version44 : public Version43
	{
	protected:
		using PFNGLBUFFERSTORAGEPROC = void (APIENTRYP) (GLenum target, GLsizeiptr size, const void* data, GLbitfield flags);
		using PFNGLCLEARTEXIMAGEPROC = void (APIENTRYP) (GLuint texture, GLint level, GLenum format, GLenum type, const void* data);
		using PFNGLCLEARTEXSUBIMAGEPROC = void (APIENTRYP) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* data);
		using PFNGLBINDBUFFERSBASEPROC = void (APIENTRYP) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers);
		using PFNGLBINDBUFFERSRANGEPROC = void (APIENTRYP) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr* offsets, const GLsizeiptr* sizes);
		using PFNGLBINDTEXTURESPROC = void (APIENTRYP) (GLuint first, GLsizei count, const GLuint* textures);
		using PFNGLBINDSAMPLERSPROC = void (APIENTRYP) (GLuint first, GLsizei count, const GLuint* samplers);
		using PFNGLBINDIMAGETEXTURESPROC = void (APIENTRYP) (GLuint first, GLsizei count, const GLuint* textures);
		using PFNGLBINDVERTEXBUFFERSPROC = void (APIENTRYP) (GLuint first, GLsizei count, const GLuint* buffers, const GLintptr* offsets, const GLsizei* strides);

	private:
		bool Available;

	public:
		Version44() = delete;
		Version44(Func_GetProcAddress GetProcAddress);
		inline bool Version44IsAvailable() { return Available; }

		static constexpr GLenum MAX_VERTEX_ATTRIB_STRIDE = 0x82E5;
		static constexpr GLenum PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED = 0x8221;
		static constexpr GLenum TEXTURE_BUFFER_BINDING = 0x8C2A;
		static constexpr GLbitfield MAP_PERSISTENT_BIT = 0x0040;
		static constexpr GLbitfield MAP_COHERENT_BIT = 0x0080;
		static constexpr GLbitfield DYNAMIC_STORAGE_BIT = 0x0100;
		static constexpr GLbitfield CLIENT_STORAGE_BIT = 0x0200;
		static constexpr GLbitfield CLIENT_MAPPED_BUFFER_BARRIER_BIT = 0x00004000;
		static constexpr GLenum BUFFER_IMMUTABLE_STORAGE = 0x821F;
		static constexpr GLenum BUFFER_STORAGE_FLAGS = 0x8220;
		static constexpr GLenum CLEAR_TEXTURE = 0x9365;
		static constexpr GLenum LOCATION_COMPONENT = 0x934A;
		static constexpr GLenum TRANSFORM_FEEDBACK_BUFFER_INDEX = 0x934B;
		static constexpr GLenum TRANSFORM_FEEDBACK_BUFFER_STRIDE = 0x934C;
		static constexpr GLenum QUERY_BUFFER = 0x9192;
		static constexpr GLbitfield QUERY_BUFFER_BARRIER_BIT = 0x00008000;
		static constexpr GLenum QUERY_BUFFER_BINDING = 0x9193;
		static constexpr GLenum QUERY_RESULT_NO_WAIT = 0x9194;
		static constexpr GLenum MIRROR_CLAMP_TO_EDGE = 0x8743;

		PFNGLBUFFERSTORAGEPROC BufferStorage;
		PFNGLCLEARTEXIMAGEPROC ClearTexImage;
		PFNGLCLEARTEXSUBIMAGEPROC ClearTexSubImage;
		PFNGLBINDBUFFERSBASEPROC BindBuffersBase;
		PFNGLBINDBUFFERSRANGEPROC BindBuffersRange;
		PFNGLBINDTEXTURESPROC BindTextures;
		PFNGLBINDSAMPLERSPROC BindSamplers;
		PFNGLBINDIMAGETEXTURESPROC BindImageTextures;
		PFNGLBINDVERTEXBUFFERSPROC BindVertexBuffers;

	};

	class Version45 : public Version44
	{
	protected:
		using PFNGLCLIPCONTROLPROC = void (APIENTRYP) (GLenum origin, GLenum depth);
		using PFNGLCREATETRANSFORMFEEDBACKSPROC = void (APIENTRYP) (GLsizei n, GLuint* ids);
		using PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC = void (APIENTRYP) (GLuint xfb, GLuint index, GLuint buffer);
		using PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC = void (APIENTRYP) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
		using PFNGLGETTRANSFORMFEEDBACKIVPROC = void (APIENTRYP) (GLuint xfb, GLenum pname, GLint* param);
		using PFNGLGETTRANSFORMFEEDBACKI_VPROC = void (APIENTRYP) (GLuint xfb, GLenum pname, GLuint index, GLint* param);
		using PFNGLGETTRANSFORMFEEDBACKI64_VPROC = void (APIENTRYP) (GLuint xfb, GLenum pname, GLuint index, GLint64* param);
		using PFNGLCREATEBUFFERSPROC = void (APIENTRYP) (GLsizei n, GLuint* buffers);
		using PFNGLNAMEDBUFFERSTORAGEPROC = void (APIENTRYP) (GLuint buffer, GLsizeiptr size, const void* data, GLbitfield flags);
		using PFNGLNAMEDBUFFERDATAPROC = void (APIENTRYP) (GLuint buffer, GLsizeiptr size, const void* data, GLenum usage);
		using PFNGLNAMEDBUFFERSUBDATAPROC = void (APIENTRYP) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data);
		using PFNGLCOPYNAMEDBUFFERSUBDATAPROC = void (APIENTRYP) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
		using PFNGLCLEARNAMEDBUFFERDATAPROC = void (APIENTRYP) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void* data);
		using PFNGLCLEARNAMEDBUFFERSUBDATAPROC = void (APIENTRYP) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void* data);
		using PFNGLMAPNAMEDBUFFERPROC = void* (APIENTRYP) (GLuint buffer, GLenum access);
		using PFNGLMAPNAMEDBUFFERRANGEPROC = void* (APIENTRYP) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access);
		using PFNGLUNMAPNAMEDBUFFERPROC = GLboolean (APIENTRYP) (GLuint buffer);
		using PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC = void (APIENTRYP) (GLuint buffer, GLintptr offset, GLsizeiptr length);
		using PFNGLGETNAMEDBUFFERPARAMETERIVPROC = void (APIENTRYP) (GLuint buffer, GLenum pname, GLint* params);
		using PFNGLGETNAMEDBUFFERPARAMETERI64VPROC = void (APIENTRYP) (GLuint buffer, GLenum pname, GLint64* params);
		using PFNGLGETNAMEDBUFFERPOINTERVPROC = void (APIENTRYP) (GLuint buffer, GLenum pname, void** params);
		using PFNGLGETNAMEDBUFFERSUBDATAPROC = void (APIENTRYP) (GLuint buffer, GLintptr offset, GLsizeiptr size, void* data);
		using PFNGLCREATEFRAMEBUFFERSPROC = void (APIENTRYP) (GLsizei n, GLuint* framebuffers);
		using PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC = void (APIENTRYP) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
		using PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC = void (APIENTRYP) (GLuint framebuffer, GLenum pname, GLint param);
		using PFNGLNAMEDFRAMEBUFFERTEXTUREPROC = void (APIENTRYP) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);
		using PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC = void (APIENTRYP) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);
		using PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC = void (APIENTRYP) (GLuint framebuffer, GLenum buf);
		using PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC = void (APIENTRYP) (GLuint framebuffer, GLsizei n, const GLenum* bufs);
		using PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC = void (APIENTRYP) (GLuint framebuffer, GLenum src);
		using PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC = void (APIENTRYP) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments);
		using PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC = void (APIENTRYP) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height);
		using PFNGLCLEARNAMEDFRAMEBUFFERIVPROC = void (APIENTRYP) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint* value);
		using PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC = void (APIENTRYP) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint* value);
		using PFNGLCLEARNAMEDFRAMEBUFFERFVPROC = void (APIENTRYP) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat* value);
		using PFNGLCLEARNAMEDFRAMEBUFFERFIPROC = void (APIENTRYP) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
		using PFNGLBLITNAMEDFRAMEBUFFERPROC = void (APIENTRYP) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
		using PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC = GLenum (APIENTRYP) (GLuint framebuffer, GLenum target);
		using PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC = void (APIENTRYP) (GLuint framebuffer, GLenum pname, GLint* param);
		using PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC = void (APIENTRYP) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params);
		using PFNGLCREATERENDERBUFFERSPROC = void (APIENTRYP) (GLsizei n, GLuint* renderbuffers);
		using PFNGLNAMEDRENDERBUFFERSTORAGEPROC = void (APIENTRYP) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);
		using PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC = void (APIENTRYP) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
		using PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC = void (APIENTRYP) (GLuint renderbuffer, GLenum pname, GLint* params);
		using PFNGLCREATETEXTURESPROC = void (APIENTRYP) (GLenum target, GLsizei n, GLuint* textures);
		using PFNGLTEXTUREBUFFERPROC = void (APIENTRYP) (GLuint texture, GLenum internalformat, GLuint buffer);
		using PFNGLTEXTUREBUFFERRANGEPROC = void (APIENTRYP) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
		using PFNGLTEXTURESTORAGE1DPROC = void (APIENTRYP) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width);
		using PFNGLTEXTURESTORAGE2DPROC = void (APIENTRYP) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
		using PFNGLTEXTURESTORAGE3DPROC = void (APIENTRYP) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
		using PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC = void (APIENTRYP) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
		using PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC = void (APIENTRYP) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
		using PFNGLTEXTURESUBIMAGE1DPROC = void (APIENTRYP) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels);
		using PFNGLTEXTURESUBIMAGE2DPROC = void (APIENTRYP) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);
		using PFNGLTEXTURESUBIMAGE3DPROC = void (APIENTRYP) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);
		using PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC = void (APIENTRYP) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data);
		using PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC = void (APIENTRYP) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);
		using PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC = void (APIENTRYP) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);
		using PFNGLCOPYTEXTURESUBIMAGE1DPROC = void (APIENTRYP) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
		using PFNGLCOPYTEXTURESUBIMAGE2DPROC = void (APIENTRYP) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
		using PFNGLCOPYTEXTURESUBIMAGE3DPROC = void (APIENTRYP) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
		using PFNGLTEXTUREPARAMETERFPROC = void (APIENTRYP) (GLuint texture, GLenum pname, GLfloat param);
		using PFNGLTEXTUREPARAMETERFVPROC = void (APIENTRYP) (GLuint texture, GLenum pname, const GLfloat* param);
		using PFNGLTEXTUREPARAMETERIPROC = void (APIENTRYP) (GLuint texture, GLenum pname, GLint param);
		using PFNGLTEXTUREPARAMETERIIVPROC = void (APIENTRYP) (GLuint texture, GLenum pname, const GLint* params);
		using PFNGLTEXTUREPARAMETERIUIVPROC = void (APIENTRYP) (GLuint texture, GLenum pname, const GLuint* params);
		using PFNGLTEXTUREPARAMETERIVPROC = void (APIENTRYP) (GLuint texture, GLenum pname, const GLint* param);
		using PFNGLGENERATETEXTUREMIPMAPPROC = void (APIENTRYP) (GLuint texture);
		using PFNGLBINDTEXTUREUNITPROC = void (APIENTRYP) (GLuint unit, GLuint texture);
		using PFNGLGETTEXTUREIMAGEPROC = void (APIENTRYP) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* pixels);
		using PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC = void (APIENTRYP) (GLuint texture, GLint level, GLsizei bufSize, void* pixels);
		using PFNGLGETTEXTURELEVELPARAMETERFVPROC = void (APIENTRYP) (GLuint texture, GLint level, GLenum pname, GLfloat* params);
		using PFNGLGETTEXTURELEVELPARAMETERIVPROC = void (APIENTRYP) (GLuint texture, GLint level, GLenum pname, GLint* params);
		using PFNGLGETTEXTUREPARAMETERFVPROC = void (APIENTRYP) (GLuint texture, GLenum pname, GLfloat* params);
		using PFNGLGETTEXTUREPARAMETERIIVPROC = void (APIENTRYP) (GLuint texture, GLenum pname, GLint* params);
		using PFNGLGETTEXTUREPARAMETERIUIVPROC = void (APIENTRYP) (GLuint texture, GLenum pname, GLuint* params);
		using PFNGLGETTEXTUREPARAMETERIVPROC = void (APIENTRYP) (GLuint texture, GLenum pname, GLint* params);
		using PFNGLCREATEVERTEXARRAYSPROC = void (APIENTRYP) (GLsizei n, GLuint* arrays);
		using PFNGLDISABLEVERTEXARRAYATTRIBPROC = void (APIENTRYP) (GLuint vaobj, GLuint index);
		using PFNGLENABLEVERTEXARRAYATTRIBPROC = void (APIENTRYP) (GLuint vaobj, GLuint index);
		using PFNGLVERTEXARRAYELEMENTBUFFERPROC = void (APIENTRYP) (GLuint vaobj, GLuint buffer);
		using PFNGLVERTEXARRAYVERTEXBUFFERPROC = void (APIENTRYP) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
		using PFNGLVERTEXARRAYVERTEXBUFFERSPROC = void (APIENTRYP) (GLuint vaobj, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr* offsets, const GLsizei* strides);
		using PFNGLVERTEXARRAYATTRIBBINDINGPROC = void (APIENTRYP) (GLuint vaobj, GLuint attribindex, GLuint bindingindex);
		using PFNGLVERTEXARRAYATTRIBFORMATPROC = void (APIENTRYP) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
		using PFNGLVERTEXARRAYATTRIBIFORMATPROC = void (APIENTRYP) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
		using PFNGLVERTEXARRAYATTRIBLFORMATPROC = void (APIENTRYP) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
		using PFNGLVERTEXARRAYBINDINGDIVISORPROC = void (APIENTRYP) (GLuint vaobj, GLuint bindingindex, GLuint divisor);
		using PFNGLGETVERTEXARRAYIVPROC = void (APIENTRYP) (GLuint vaobj, GLenum pname, GLint* param);
		using PFNGLGETVERTEXARRAYINDEXEDIVPROC = void (APIENTRYP) (GLuint vaobj, GLuint index, GLenum pname, GLint* param);
		using PFNGLGETVERTEXARRAYINDEXED64IVPROC = void (APIENTRYP) (GLuint vaobj, GLuint index, GLenum pname, GLint64* param);
		using PFNGLCREATESAMPLERSPROC = void (APIENTRYP) (GLsizei n, GLuint* samplers);
		using PFNGLCREATEPROGRAMPIPELINESPROC = void (APIENTRYP) (GLsizei n, GLuint* pipelines);
		using PFNGLCREATEQUERIESPROC = void (APIENTRYP) (GLenum target, GLsizei n, GLuint* ids);
		using PFNGLGETQUERYBUFFEROBJECTI64VPROC = void (APIENTRYP) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset);
		using PFNGLGETQUERYBUFFEROBJECTIVPROC = void (APIENTRYP) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset);
		using PFNGLGETQUERYBUFFEROBJECTUI64VPROC = void (APIENTRYP) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset);
		using PFNGLGETQUERYBUFFEROBJECTUIVPROC = void (APIENTRYP) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset);
		using PFNGLMEMORYBARRIERBYREGIONPROC = void (APIENTRYP) (GLbitfield barriers);
		using PFNGLGETTEXTURESUBIMAGEPROC = void (APIENTRYP) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void* pixels);
		using PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC = void (APIENTRYP) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void* pixels);
		using PFNGLGETGRAPHICSRESETSTATUSPROC = GLenum (APIENTRYP) (void);
		using PFNGLGETNCOMPRESSEDTEXIMAGEPROC = void (APIENTRYP) (GLenum target, GLint lod, GLsizei bufSize, void* pixels);
		using PFNGLGETNTEXIMAGEPROC = void (APIENTRYP) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* pixels);
		using PFNGLGETNUNIFORMDVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei bufSize, GLdouble* params);
		using PFNGLGETNUNIFORMFVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params);
		using PFNGLGETNUNIFORMIVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei bufSize, GLint* params);
		using PFNGLGETNUNIFORMUIVPROC = void (APIENTRYP) (GLuint program, GLint location, GLsizei bufSize, GLuint* params);
		using PFNGLREADNPIXELSPROC = void (APIENTRYP) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data);
		using PFNGLGETNMAPDVPROC = void (APIENTRYP) (GLenum target, GLenum query, GLsizei bufSize, GLdouble* v);
		using PFNGLGETNMAPFVPROC = void (APIENTRYP) (GLenum target, GLenum query, GLsizei bufSize, GLfloat* v);
		using PFNGLGETNMAPIVPROC = void (APIENTRYP) (GLenum target, GLenum query, GLsizei bufSize, GLint* v);
		using PFNGLGETNPIXELMAPFVPROC = void (APIENTRYP) (GLenum map, GLsizei bufSize, GLfloat* values);
		using PFNGLGETNPIXELMAPUIVPROC = void (APIENTRYP) (GLenum map, GLsizei bufSize, GLuint* values);
		using PFNGLGETNPIXELMAPUSVPROC = void (APIENTRYP) (GLenum map, GLsizei bufSize, GLushort* values);
		using PFNGLGETNPOLYGONSTIPPLEPROC = void (APIENTRYP) (GLsizei bufSize, GLubyte* pattern);
		using PFNGLGETNCOLORTABLEPROC = void (APIENTRYP) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* table);
		using PFNGLGETNCONVOLUTIONFILTERPROC = void (APIENTRYP) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* image);
		using PFNGLGETNSEPARABLEFILTERPROC = void (APIENTRYP) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void* row, GLsizei columnBufSize, void* column, void* span);
		using PFNGLGETNHISTOGRAMPROC = void (APIENTRYP) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values);
		using PFNGLGETNMINMAXPROC = void (APIENTRYP) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values);
		using PFNGLTEXTUREBARRIERPROC = void (APIENTRYP) (void);

	private:
		bool Available;

	public:
		Version45() = delete;
		Version45(Func_GetProcAddress GetProcAddress);
		inline bool Version45IsAvailable() { return Available; }

		static constexpr GLenum CONTEXT_LOST = 0x0507;
		static constexpr GLenum NEGATIVE_ONE_TO_ONE = 0x935E;
		static constexpr GLenum ZERO_TO_ONE = 0x935F;
		static constexpr GLenum CLIP_ORIGIN = 0x935C;
		static constexpr GLenum CLIP_DEPTH_MODE = 0x935D;
		static constexpr GLenum QUERY_WAIT_INVERTED = 0x8E17;
		static constexpr GLenum QUERY_NO_WAIT_INVERTED = 0x8E18;
		static constexpr GLenum QUERY_BY_REGION_WAIT_INVERTED = 0x8E19;
		static constexpr GLenum QUERY_BY_REGION_NO_WAIT_INVERTED = 0x8E1A;
		static constexpr GLenum MAX_CULL_DISTANCES = 0x82F9;
		static constexpr GLenum MAX_COMBINED_CLIP_AND_CULL_DISTANCES = 0x82FA;
		static constexpr GLenum TEXTURE_TARGET = 0x1006;
		static constexpr GLenum QUERY_TARGET = 0x82EA;
		static constexpr GLenum GUILTY_CONTEXT_RESET = 0x8253;
		static constexpr GLenum INNOCENT_CONTEXT_RESET = 0x8254;
		static constexpr GLenum UNKNOWN_CONTEXT_RESET = 0x8255;
		static constexpr GLenum RESET_NOTIFICATION_STRATEGY = 0x8256;
		static constexpr GLenum LOSE_CONTEXT_ON_RESET = 0x8252;
		static constexpr GLenum NO_RESET_NOTIFICATION = 0x8261;
		static constexpr GLbitfield CONTEXT_FLAG_ROBUST_ACCESS_BIT = 0x00000004;
		static constexpr GLenum COLOR_TABLE = 0x80D0;
		static constexpr GLenum POST_CONVOLUTION_COLOR_TABLE = 0x80D1;
		static constexpr GLenum POST_COLOR_MATRIX_COLOR_TABLE = 0x80D2;
		static constexpr GLenum PROXY_COLOR_TABLE = 0x80D3;
		static constexpr GLenum PROXY_POST_CONVOLUTION_COLOR_TABLE = 0x80D4;
		static constexpr GLenum PROXY_POST_COLOR_MATRIX_COLOR_TABLE = 0x80D5;
		static constexpr GLenum CONVOLUTION_1D = 0x8010;
		static constexpr GLenum CONVOLUTION_2D = 0x8011;
		static constexpr GLenum SEPARABLE_2D = 0x8012;
		static constexpr GLenum HISTOGRAM = 0x8024;
		static constexpr GLenum PROXY_HISTOGRAM = 0x8025;
		static constexpr GLenum MINMAX = 0x802E;
		static constexpr GLenum CONTEXT_RELEASE_BEHAVIOR = 0x82FB;
		static constexpr GLenum CONTEXT_RELEASE_BEHAVIOR_FLUSH = 0x82FC;

		PFNGLCLIPCONTROLPROC ClipControl;
		PFNGLCREATETRANSFORMFEEDBACKSPROC CreateTransformFeedbacks;
		PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC TransformFeedbackBufferBase;
		PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC TransformFeedbackBufferRange;
		PFNGLGETTRANSFORMFEEDBACKIVPROC GetTransformFeedbackiv;
		PFNGLGETTRANSFORMFEEDBACKI_VPROC GetTransformFeedbacki_v;
		PFNGLGETTRANSFORMFEEDBACKI64_VPROC GetTransformFeedbacki64_v;
		PFNGLCREATEBUFFERSPROC CreateBuffers;
		PFNGLNAMEDBUFFERSTORAGEPROC NamedBufferStorage;
		PFNGLNAMEDBUFFERDATAPROC NamedBufferData;
		PFNGLNAMEDBUFFERSUBDATAPROC NamedBufferSubData;
		PFNGLCOPYNAMEDBUFFERSUBDATAPROC CopyNamedBufferSubData;
		PFNGLCLEARNAMEDBUFFERDATAPROC ClearNamedBufferData;
		PFNGLCLEARNAMEDBUFFERSUBDATAPROC ClearNamedBufferSubData;
		PFNGLMAPNAMEDBUFFERPROC MapNamedBuffer;
		PFNGLMAPNAMEDBUFFERRANGEPROC MapNamedBufferRange;
		PFNGLUNMAPNAMEDBUFFERPROC UnmapNamedBuffer;
		PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC FlushMappedNamedBufferRange;
		PFNGLGETNAMEDBUFFERPARAMETERIVPROC GetNamedBufferParameteriv;
		PFNGLGETNAMEDBUFFERPARAMETERI64VPROC GetNamedBufferParameteri64v;
		PFNGLGETNAMEDBUFFERPOINTERVPROC GetNamedBufferPointerv;
		PFNGLGETNAMEDBUFFERSUBDATAPROC GetNamedBufferSubData;
		PFNGLCREATEFRAMEBUFFERSPROC CreateFramebuffers;
		PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC NamedFramebufferRenderbuffer;
		PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC NamedFramebufferParameteri;
		PFNGLNAMEDFRAMEBUFFERTEXTUREPROC NamedFramebufferTexture;
		PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC NamedFramebufferTextureLayer;
		PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC NamedFramebufferDrawBuffer;
		PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC NamedFramebufferDrawBuffers;
		PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC NamedFramebufferReadBuffer;
		PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC InvalidateNamedFramebufferData;
		PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC InvalidateNamedFramebufferSubData;
		PFNGLCLEARNAMEDFRAMEBUFFERIVPROC ClearNamedFramebufferiv;
		PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC ClearNamedFramebufferuiv;
		PFNGLCLEARNAMEDFRAMEBUFFERFVPROC ClearNamedFramebufferfv;
		PFNGLCLEARNAMEDFRAMEBUFFERFIPROC ClearNamedFramebufferfi;
		PFNGLBLITNAMEDFRAMEBUFFERPROC BlitNamedFramebuffer;
		PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC CheckNamedFramebufferStatus;
		PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC GetNamedFramebufferParameteriv;
		PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC GetNamedFramebufferAttachmentParameteriv;
		PFNGLCREATERENDERBUFFERSPROC CreateRenderbuffers;
		PFNGLNAMEDRENDERBUFFERSTORAGEPROC NamedRenderbufferStorage;
		PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC NamedRenderbufferStorageMultisample;
		PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC GetNamedRenderbufferParameteriv;
		PFNGLCREATETEXTURESPROC CreateTextures;
		PFNGLTEXTUREBUFFERPROC TextureBuffer;
		PFNGLTEXTUREBUFFERRANGEPROC TextureBufferRange;
		PFNGLTEXTURESTORAGE1DPROC TextureStorage1D;
		PFNGLTEXTURESTORAGE2DPROC TextureStorage2D;
		PFNGLTEXTURESTORAGE3DPROC TextureStorage3D;
		PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC TextureStorage2DMultisample;
		PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC TextureStorage3DMultisample;
		PFNGLTEXTURESUBIMAGE1DPROC TextureSubImage1D;
		PFNGLTEXTURESUBIMAGE2DPROC TextureSubImage2D;
		PFNGLTEXTURESUBIMAGE3DPROC TextureSubImage3D;
		PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC CompressedTextureSubImage1D;
		PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC CompressedTextureSubImage2D;
		PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC CompressedTextureSubImage3D;
		PFNGLCOPYTEXTURESUBIMAGE1DPROC CopyTextureSubImage1D;
		PFNGLCOPYTEXTURESUBIMAGE2DPROC CopyTextureSubImage2D;
		PFNGLCOPYTEXTURESUBIMAGE3DPROC CopyTextureSubImage3D;
		PFNGLTEXTUREPARAMETERFPROC TextureParameterf;
		PFNGLTEXTUREPARAMETERFVPROC TextureParameterfv;
		PFNGLTEXTUREPARAMETERIPROC TextureParameteri;
		PFNGLTEXTUREPARAMETERIIVPROC TextureParameterIiv;
		PFNGLTEXTUREPARAMETERIUIVPROC TextureParameterIuiv;
		PFNGLTEXTUREPARAMETERIVPROC TextureParameteriv;
		PFNGLGENERATETEXTUREMIPMAPPROC GenerateTextureMipmap;
		PFNGLBINDTEXTUREUNITPROC BindTextureUnit;
		PFNGLGETTEXTUREIMAGEPROC GetTextureImage;
		PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC GetCompressedTextureImage;
		PFNGLGETTEXTURELEVELPARAMETERFVPROC GetTextureLevelParameterfv;
		PFNGLGETTEXTURELEVELPARAMETERIVPROC GetTextureLevelParameteriv;
		PFNGLGETTEXTUREPARAMETERFVPROC GetTextureParameterfv;
		PFNGLGETTEXTUREPARAMETERIIVPROC GetTextureParameterIiv;
		PFNGLGETTEXTUREPARAMETERIUIVPROC GetTextureParameterIuiv;
		PFNGLGETTEXTUREPARAMETERIVPROC GetTextureParameteriv;
		PFNGLCREATEVERTEXARRAYSPROC CreateVertexArrays;
		PFNGLDISABLEVERTEXARRAYATTRIBPROC DisableVertexArrayAttrib;
		PFNGLENABLEVERTEXARRAYATTRIBPROC EnableVertexArrayAttrib;
		PFNGLVERTEXARRAYELEMENTBUFFERPROC VertexArrayElementBuffer;
		PFNGLVERTEXARRAYVERTEXBUFFERPROC VertexArrayVertexBuffer;
		PFNGLVERTEXARRAYVERTEXBUFFERSPROC VertexArrayVertexBuffers;
		PFNGLVERTEXARRAYATTRIBBINDINGPROC VertexArrayAttribBinding;
		PFNGLVERTEXARRAYATTRIBFORMATPROC VertexArrayAttribFormat;
		PFNGLVERTEXARRAYATTRIBIFORMATPROC VertexArrayAttribIFormat;
		PFNGLVERTEXARRAYATTRIBLFORMATPROC VertexArrayAttribLFormat;
		PFNGLVERTEXARRAYBINDINGDIVISORPROC VertexArrayBindingDivisor;
		PFNGLGETVERTEXARRAYIVPROC GetVertexArrayiv;
		PFNGLGETVERTEXARRAYINDEXEDIVPROC GetVertexArrayIndexediv;
		PFNGLGETVERTEXARRAYINDEXED64IVPROC GetVertexArrayIndexed64iv;
		PFNGLCREATESAMPLERSPROC CreateSamplers;
		PFNGLCREATEPROGRAMPIPELINESPROC CreateProgramPipelines;
		PFNGLCREATEQUERIESPROC CreateQueries;
		PFNGLGETQUERYBUFFEROBJECTI64VPROC GetQueryBufferObjecti64v;
		PFNGLGETQUERYBUFFEROBJECTIVPROC GetQueryBufferObjectiv;
		PFNGLGETQUERYBUFFEROBJECTUI64VPROC GetQueryBufferObjectui64v;
		PFNGLGETQUERYBUFFEROBJECTUIVPROC GetQueryBufferObjectuiv;
		PFNGLMEMORYBARRIERBYREGIONPROC MemoryBarrierByRegion;
		PFNGLGETTEXTURESUBIMAGEPROC GetTextureSubImage;
		PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC GetCompressedTextureSubImage;
		PFNGLGETGRAPHICSRESETSTATUSPROC GetGraphicsResetStatus;
		PFNGLGETNCOMPRESSEDTEXIMAGEPROC GetnCompressedTexImage;
		PFNGLGETNTEXIMAGEPROC GetnTexImage;
		PFNGLGETNUNIFORMDVPROC GetnUniformdv;
		PFNGLGETNUNIFORMFVPROC GetnUniformfv;
		PFNGLGETNUNIFORMIVPROC GetnUniformiv;
		PFNGLGETNUNIFORMUIVPROC GetnUniformuiv;
		PFNGLREADNPIXELSPROC ReadnPixels;
		PFNGLGETNMAPDVPROC GetnMapdv;
		PFNGLGETNMAPFVPROC GetnMapfv;
		PFNGLGETNMAPIVPROC GetnMapiv;
		PFNGLGETNPIXELMAPFVPROC GetnPixelMapfv;
		PFNGLGETNPIXELMAPUIVPROC GetnPixelMapuiv;
		PFNGLGETNPIXELMAPUSVPROC GetnPixelMapusv;
		PFNGLGETNPOLYGONSTIPPLEPROC GetnPolygonStipple;
		PFNGLGETNCOLORTABLEPROC GetnColorTable;
		PFNGLGETNCONVOLUTIONFILTERPROC GetnConvolutionFilter;
		PFNGLGETNSEPARABLEFILTERPROC GetnSeparableFilter;
		PFNGLGETNHISTOGRAMPROC GetnHistogram;
		PFNGLGETNMINMAXPROC GetnMinmax;
		PFNGLTEXTUREBARRIERPROC TextureBarrier;

	};

	class Version46 : public Version45
	{
	protected:
		using PFNGLSPECIALIZESHADERPROC = void (APIENTRYP) (GLuint shader, const GLchar* pEntryPoint, GLuint numSpecializationConstants, const GLuint* pConstantIndex, const GLuint* pConstantValue);
		using PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC = void (APIENTRYP) (GLenum mode, const void* indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride);
		using PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC = void (APIENTRYP) (GLenum mode, GLenum type, const void* indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride);
		using PFNGLPOLYGONOFFSETCLAMPPROC = void (APIENTRYP) (GLfloat factor, GLfloat units, GLfloat clamp);

	private:
		bool Available;

	public:
		Version46() = delete;
		Version46(Func_GetProcAddress GetProcAddress);
		inline bool Version46IsAvailable() { return Available; }

		static constexpr GLenum SHADER_BINARY_FORMAT_SPIR_V = 0x9551;
		static constexpr GLenum SPIR_V_BINARY = 0x9552;
		static constexpr GLenum PARAMETER_BUFFER = 0x80EE;
		static constexpr GLenum PARAMETER_BUFFER_BINDING = 0x80EF;
		static constexpr GLbitfield CONTEXT_FLAG_NO_ERROR_BIT = 0x00000008;
		static constexpr GLenum VERTICES_SUBMITTED = 0x82EE;
		static constexpr GLenum PRIMITIVES_SUBMITTED = 0x82EF;
		static constexpr GLenum VERTEX_SHADER_INVOCATIONS = 0x82F0;
		static constexpr GLenum TESS_CONTROL_SHADER_PATCHES = 0x82F1;
		static constexpr GLenum TESS_EVALUATION_SHADER_INVOCATIONS = 0x82F2;
		static constexpr GLenum GEOMETRY_SHADER_PRIMITIVES_EMITTED = 0x82F3;
		static constexpr GLenum FRAGMENT_SHADER_INVOCATIONS = 0x82F4;
		static constexpr GLenum COMPUTE_SHADER_INVOCATIONS = 0x82F5;
		static constexpr GLenum CLIPPING_INPUT_PRIMITIVES = 0x82F6;
		static constexpr GLenum CLIPPING_OUTPUT_PRIMITIVES = 0x82F7;
		static constexpr GLenum POLYGON_OFFSET_CLAMP = 0x8E1B;
		static constexpr GLenum SPIR_V_EXTENSIONS = 0x9553;
		static constexpr GLenum NUM_SPIR_V_EXTENSIONS = 0x9554;
		static constexpr GLenum TEXTURE_MAX_ANISOTROPY = 0x84FE;
		static constexpr GLenum MAX_TEXTURE_MAX_ANISOTROPY = 0x84FF;
		static constexpr GLenum TRANSFORM_FEEDBACK_OVERFLOW = 0x82EC;
		static constexpr GLenum TRANSFORM_FEEDBACK_STREAM_OVERFLOW = 0x82ED;

		PFNGLSPECIALIZESHADERPROC SpecializeShader;
		PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC MultiDrawArraysIndirectCount;
		PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC MultiDrawElementsIndirectCount;
		PFNGLPOLYGONOFFSETCLAMPPROC PolygonOffsetClamp;

	};
	typedef khronos_int32_t GLfixed;

	class EsVersion20 : public Version46
	{
	protected:

	private:
		bool Available;

	public:
		EsVersion20() = delete;
		EsVersion20(Func_GetProcAddress GetProcAddress);
		inline bool EsVersion20IsAvailable() { return Available; }

		static constexpr GLenum RED_BITS = 0x0D52;
		static constexpr GLenum GREEN_BITS = 0x0D53;
		static constexpr GLenum BLUE_BITS = 0x0D54;
		static constexpr GLenum ALPHA_BITS = 0x0D55;
		static constexpr GLenum DEPTH_BITS = 0x0D56;
		static constexpr GLenum STENCIL_BITS = 0x0D57;
		static constexpr GLenum LUMINANCE = 0x1909;
		static constexpr GLenum LUMINANCE_ALPHA = 0x190A;
		static constexpr GLenum FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9;

		PFNGLACTIVETEXTUREPROC ActiveTexture;
		PFNGLATTACHSHADERPROC AttachShader;
		PFNGLBINDATTRIBLOCATIONPROC BindAttribLocation;
		PFNGLBINDBUFFERPROC BindBuffer;
		PFNGLBINDFRAMEBUFFERPROC BindFramebuffer;
		PFNGLBINDRENDERBUFFERPROC BindRenderbuffer;
		PFNGLBINDTEXTUREPROC BindTexture;
		PFNGLBLENDCOLORPROC BlendColor;
		PFNGLBLENDEQUATIONPROC BlendEquation;
		PFNGLBLENDEQUATIONSEPARATEPROC BlendEquationSeparate;
		PFNGLBLENDFUNCPROC BlendFunc;
		PFNGLBLENDFUNCSEPARATEPROC BlendFuncSeparate;
		PFNGLBUFFERDATAPROC BufferData;
		PFNGLBUFFERSUBDATAPROC BufferSubData;
		PFNGLCHECKFRAMEBUFFERSTATUSPROC CheckFramebufferStatus;
		PFNGLCLEARPROC Clear;
		PFNGLCLEARCOLORPROC ClearColor;
		PFNGLCLEARDEPTHFPROC ClearDepthf;
		PFNGLCLEARSTENCILPROC ClearStencil;
		PFNGLCOLORMASKPROC ColorMask;
		PFNGLCOMPILESHADERPROC CompileShader;
		PFNGLCOMPRESSEDTEXIMAGE2DPROC CompressedTexImage2D;
		PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC CompressedTexSubImage2D;
		PFNGLCOPYTEXIMAGE2DPROC CopyTexImage2D;
		PFNGLCOPYTEXSUBIMAGE2DPROC CopyTexSubImage2D;
		PFNGLCREATEPROGRAMPROC CreateProgram;
		PFNGLCREATESHADERPROC CreateShader;
		PFNGLCULLFACEPROC CullFace;
		PFNGLDELETEBUFFERSPROC DeleteBuffers;
		PFNGLDELETEFRAMEBUFFERSPROC DeleteFramebuffers;
		PFNGLDELETEPROGRAMPROC DeleteProgram;
		PFNGLDELETERENDERBUFFERSPROC DeleteRenderbuffers;
		PFNGLDELETESHADERPROC DeleteShader;
		PFNGLDELETETEXTURESPROC DeleteTextures;
		PFNGLDEPTHFUNCPROC DepthFunc;
		PFNGLDEPTHMASKPROC DepthMask;
		PFNGLDEPTHRANGEFPROC DepthRangef;
		PFNGLDETACHSHADERPROC DetachShader;
		PFNGLDISABLEPROC Disable;
		PFNGLDISABLEVERTEXATTRIBARRAYPROC DisableVertexAttribArray;
		PFNGLDRAWARRAYSPROC DrawArrays;
		PFNGLDRAWELEMENTSPROC DrawElements;
		PFNGLENABLEPROC Enable;
		PFNGLENABLEVERTEXATTRIBARRAYPROC EnableVertexAttribArray;
		PFNGLFINISHPROC Finish;
		PFNGLFLUSHPROC Flush;
		PFNGLFRAMEBUFFERRENDERBUFFERPROC FramebufferRenderbuffer;
		PFNGLFRAMEBUFFERTEXTURE2DPROC FramebufferTexture2D;
		PFNGLFRONTFACEPROC FrontFace;
		PFNGLGENBUFFERSPROC GenBuffers;
		PFNGLGENERATEMIPMAPPROC GenerateMipmap;
		PFNGLGENFRAMEBUFFERSPROC GenFramebuffers;
		PFNGLGENRENDERBUFFERSPROC GenRenderbuffers;
		PFNGLGENTEXTURESPROC GenTextures;
		PFNGLGETACTIVEATTRIBPROC GetActiveAttrib;
		PFNGLGETACTIVEUNIFORMPROC GetActiveUniform;
		PFNGLGETATTACHEDSHADERSPROC GetAttachedShaders;
		PFNGLGETATTRIBLOCATIONPROC GetAttribLocation;
		PFNGLGETBOOLEANVPROC GetBooleanv;
		PFNGLGETBUFFERPARAMETERIVPROC GetBufferParameteriv;
		PFNGLGETERRORPROC GetError;
		PFNGLGETFLOATVPROC GetFloatv;
		PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC GetFramebufferAttachmentParameteriv;
		PFNGLGETINTEGERVPROC GetIntegerv;
		PFNGLGETPROGRAMIVPROC GetProgramiv;
		PFNGLGETPROGRAMINFOLOGPROC GetProgramInfoLog;
		PFNGLGETRENDERBUFFERPARAMETERIVPROC GetRenderbufferParameteriv;
		PFNGLGETSHADERIVPROC GetShaderiv;
		PFNGLGETSHADERINFOLOGPROC GetShaderInfoLog;
		PFNGLGETSHADERPRECISIONFORMATPROC GetShaderPrecisionFormat;
		PFNGLGETSHADERSOURCEPROC GetShaderSource;
		PFNGLGETSTRINGPROC GetString;
		PFNGLGETTEXPARAMETERFVPROC GetTexParameterfv;
		PFNGLGETTEXPARAMETERIVPROC GetTexParameteriv;
		PFNGLGETUNIFORMFVPROC GetUniformfv;
		PFNGLGETUNIFORMIVPROC GetUniformiv;
		PFNGLGETUNIFORMLOCATIONPROC GetUniformLocation;
		PFNGLGETVERTEXATTRIBFVPROC GetVertexAttribfv;
		PFNGLGETVERTEXATTRIBIVPROC GetVertexAttribiv;
		PFNGLGETVERTEXATTRIBPOINTERVPROC GetVertexAttribPointerv;
		PFNGLHINTPROC Hint;
		PFNGLISBUFFERPROC IsBuffer;
		PFNGLISENABLEDPROC IsEnabled;
		PFNGLISFRAMEBUFFERPROC IsFramebuffer;
		PFNGLISPROGRAMPROC IsProgram;
		PFNGLISRENDERBUFFERPROC IsRenderbuffer;
		PFNGLISSHADERPROC IsShader;
		PFNGLISTEXTUREPROC IsTexture;
		PFNGLLINEWIDTHPROC LineWidth;
		PFNGLLINKPROGRAMPROC LinkProgram;
		PFNGLPIXELSTOREIPROC PixelStorei;
		PFNGLPOLYGONOFFSETPROC PolygonOffset;
		PFNGLREADPIXELSPROC ReadPixels;
		PFNGLRELEASESHADERCOMPILERPROC ReleaseShaderCompiler;
		PFNGLRENDERBUFFERSTORAGEPROC RenderbufferStorage;
		PFNGLSAMPLECOVERAGEPROC SampleCoverage;
		PFNGLSCISSORPROC Scissor;
		PFNGLSHADERBINARYPROC ShaderBinary;
		PFNGLSHADERSOURCEPROC ShaderSource;
		PFNGLSTENCILFUNCPROC StencilFunc;
		PFNGLSTENCILFUNCSEPARATEPROC StencilFuncSeparate;
		PFNGLSTENCILMASKPROC StencilMask;
		PFNGLSTENCILMASKSEPARATEPROC StencilMaskSeparate;
		PFNGLSTENCILOPPROC StencilOp;
		PFNGLSTENCILOPSEPARATEPROC StencilOpSeparate;
		PFNGLTEXIMAGE2DPROC TexImage2D;
		PFNGLTEXPARAMETERFPROC TexParameterf;
		PFNGLTEXPARAMETERFVPROC TexParameterfv;
		PFNGLTEXPARAMETERIPROC TexParameteri;
		PFNGLTEXPARAMETERIVPROC TexParameteriv;
		PFNGLTEXSUBIMAGE2DPROC TexSubImage2D;
		PFNGLUNIFORM1FPROC Uniform1f;
		PFNGLUNIFORM1FVPROC Uniform1fv;
		PFNGLUNIFORM1IPROC Uniform1i;
		PFNGLUNIFORM1IVPROC Uniform1iv;
		PFNGLUNIFORM2FPROC Uniform2f;
		PFNGLUNIFORM2FVPROC Uniform2fv;
		PFNGLUNIFORM2IPROC Uniform2i;
		PFNGLUNIFORM2IVPROC Uniform2iv;
		PFNGLUNIFORM3FPROC Uniform3f;
		PFNGLUNIFORM3FVPROC Uniform3fv;
		PFNGLUNIFORM3IPROC Uniform3i;
		PFNGLUNIFORM3IVPROC Uniform3iv;
		PFNGLUNIFORM4FPROC Uniform4f;
		PFNGLUNIFORM4FVPROC Uniform4fv;
		PFNGLUNIFORM4IPROC Uniform4i;
		PFNGLUNIFORM4IVPROC Uniform4iv;
		PFNGLUNIFORMMATRIX2FVPROC UniformMatrix2fv;
		PFNGLUNIFORMMATRIX3FVPROC UniformMatrix3fv;
		PFNGLUNIFORMMATRIX4FVPROC UniformMatrix4fv;
		PFNGLUSEPROGRAMPROC UseProgram;
		PFNGLVALIDATEPROGRAMPROC ValidateProgram;
		PFNGLVERTEXATTRIB1FPROC VertexAttrib1f;
		PFNGLVERTEXATTRIB1FVPROC VertexAttrib1fv;
		PFNGLVERTEXATTRIB2FPROC VertexAttrib2f;
		PFNGLVERTEXATTRIB2FVPROC VertexAttrib2fv;
		PFNGLVERTEXATTRIB3FPROC VertexAttrib3f;
		PFNGLVERTEXATTRIB3FVPROC VertexAttrib3fv;
		PFNGLVERTEXATTRIB4FPROC VertexAttrib4f;
		PFNGLVERTEXATTRIB4FVPROC VertexAttrib4fv;
		PFNGLVERTEXATTRIBPOINTERPROC VertexAttribPointer;
		PFNGLVIEWPORTPROC Viewport;

		inline void Uniformf(GLint location, GLfloat v0) const { Uniform1f(location, v0);}
		inline void Uniformi(GLint location, GLint v0) const { Uniform1i(location, v0);}
		inline void Uniformf(GLint location, GLfloat v0, GLfloat v1) const { Uniform2f(location, v0, v1);}
		inline void Uniformi(GLint location, GLint v0, GLint v1) const { Uniform2i(location, v0, v1);}
		inline void Uniformf(GLint location, GLfloat v0, GLfloat v1, GLfloat v2) const { Uniform3f(location, v0, v1, v2);}
		inline void Uniformi(GLint location, GLint v0, GLint v1, GLint v2) const { Uniform3i(location, v0, v1, v2);}
		inline void Uniformf(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) const { Uniform4f(location, v0, v1, v2, v3);}
		inline void Uniformi(GLint location, GLint v0, GLint v1, GLint v2, GLint v3) const { Uniform4i(location, v0, v1, v2, v3);}
		inline void VertexAttribf(GLuint index, GLfloat x) const { VertexAttrib1f(index, x);}
		inline void VertexAttribf(GLuint index, GLfloat x, GLfloat y) const { VertexAttrib2f(index, x, y);}
		inline void VertexAttribf(GLuint index, GLfloat x, GLfloat y, GLfloat z) const { VertexAttrib3f(index, x, y, z);}
		inline void VertexAttribf(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) const { VertexAttrib4f(index, x, y, z, w);}
	};

	class EsVersion30 : public EsVersion20
	{
	protected:

	private:
		bool Available;

	public:
		EsVersion30() = delete;
		EsVersion30(Func_GetProcAddress GetProcAddress);
		inline bool EsVersion30IsAvailable() { return Available; }


		PFNGLREADBUFFERPROC ReadBuffer;
		PFNGLDRAWRANGEELEMENTSPROC DrawRangeElements;
		PFNGLTEXIMAGE3DPROC TexImage3D;
		PFNGLTEXSUBIMAGE3DPROC TexSubImage3D;
		PFNGLCOPYTEXSUBIMAGE3DPROC CopyTexSubImage3D;
		PFNGLCOMPRESSEDTEXIMAGE3DPROC CompressedTexImage3D;
		PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC CompressedTexSubImage3D;
		PFNGLGENQUERIESPROC GenQueries;
		PFNGLDELETEQUERIESPROC DeleteQueries;
		PFNGLISQUERYPROC IsQuery;
		PFNGLBEGINQUERYPROC BeginQuery;
		PFNGLENDQUERYPROC EndQuery;
		PFNGLGETQUERYIVPROC GetQueryiv;
		PFNGLGETQUERYOBJECTUIVPROC GetQueryObjectuiv;
		PFNGLUNMAPBUFFERPROC UnmapBuffer;
		PFNGLGETBUFFERPOINTERVPROC GetBufferPointerv;
		PFNGLDRAWBUFFERSPROC DrawBuffers;
		PFNGLUNIFORMMATRIX2X3FVPROC UniformMatrix2x3fv;
		PFNGLUNIFORMMATRIX3X2FVPROC UniformMatrix3x2fv;
		PFNGLUNIFORMMATRIX2X4FVPROC UniformMatrix2x4fv;
		PFNGLUNIFORMMATRIX4X2FVPROC UniformMatrix4x2fv;
		PFNGLUNIFORMMATRIX3X4FVPROC UniformMatrix3x4fv;
		PFNGLUNIFORMMATRIX4X3FVPROC UniformMatrix4x3fv;
		PFNGLBLITFRAMEBUFFERPROC BlitFramebuffer;
		PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC RenderbufferStorageMultisample;
		PFNGLFRAMEBUFFERTEXTURELAYERPROC FramebufferTextureLayer;
		PFNGLMAPBUFFERRANGEPROC MapBufferRange;
		PFNGLFLUSHMAPPEDBUFFERRANGEPROC FlushMappedBufferRange;
		PFNGLBINDVERTEXARRAYPROC BindVertexArray;
		PFNGLDELETEVERTEXARRAYSPROC DeleteVertexArrays;
		PFNGLGENVERTEXARRAYSPROC GenVertexArrays;
		PFNGLISVERTEXARRAYPROC IsVertexArray;
		PFNGLGETINTEGERI_VPROC GetIntegeri_v;
		PFNGLBEGINTRANSFORMFEEDBACKPROC BeginTransformFeedback;
		PFNGLENDTRANSFORMFEEDBACKPROC EndTransformFeedback;
		PFNGLBINDBUFFERRANGEPROC BindBufferRange;
		PFNGLBINDBUFFERBASEPROC BindBufferBase;
		PFNGLTRANSFORMFEEDBACKVARYINGSPROC TransformFeedbackVaryings;
		PFNGLGETTRANSFORMFEEDBACKVARYINGPROC GetTransformFeedbackVarying;
		PFNGLVERTEXATTRIBIPOINTERPROC VertexAttribIPointer;
		PFNGLGETVERTEXATTRIBIIVPROC GetVertexAttribIiv;
		PFNGLGETVERTEXATTRIBIUIVPROC GetVertexAttribIuiv;
		PFNGLVERTEXATTRIBI4IPROC VertexAttribI4i;
		PFNGLVERTEXATTRIBI4UIPROC VertexAttribI4ui;
		PFNGLVERTEXATTRIBI4IVPROC VertexAttribI4iv;
		PFNGLVERTEXATTRIBI4UIVPROC VertexAttribI4uiv;
		PFNGLGETUNIFORMUIVPROC GetUniformuiv;
		PFNGLGETFRAGDATALOCATIONPROC GetFragDataLocation;
		PFNGLUNIFORM1UIPROC Uniform1ui;
		PFNGLUNIFORM2UIPROC Uniform2ui;
		PFNGLUNIFORM3UIPROC Uniform3ui;
		PFNGLUNIFORM4UIPROC Uniform4ui;
		PFNGLUNIFORM1UIVPROC Uniform1uiv;
		PFNGLUNIFORM2UIVPROC Uniform2uiv;
		PFNGLUNIFORM3UIVPROC Uniform3uiv;
		PFNGLUNIFORM4UIVPROC Uniform4uiv;
		PFNGLCLEARBUFFERIVPROC ClearBufferiv;
		PFNGLCLEARBUFFERUIVPROC ClearBufferuiv;
		PFNGLCLEARBUFFERFVPROC ClearBufferfv;
		PFNGLCLEARBUFFERFIPROC ClearBufferfi;
		PFNGLGETSTRINGIPROC GetStringi;
		PFNGLCOPYBUFFERSUBDATAPROC CopyBufferSubData;
		PFNGLGETUNIFORMINDICESPROC GetUniformIndices;
		PFNGLGETACTIVEUNIFORMSIVPROC GetActiveUniformsiv;
		PFNGLGETUNIFORMBLOCKINDEXPROC GetUniformBlockIndex;
		PFNGLGETACTIVEUNIFORMBLOCKIVPROC GetActiveUniformBlockiv;
		PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC GetActiveUniformBlockName;
		PFNGLUNIFORMBLOCKBINDINGPROC UniformBlockBinding;
		PFNGLDRAWARRAYSINSTANCEDPROC DrawArraysInstanced;
		PFNGLDRAWELEMENTSINSTANCEDPROC DrawElementsInstanced;
		PFNGLFENCESYNCPROC FenceSync;
		PFNGLISSYNCPROC IsSync;
		PFNGLDELETESYNCPROC DeleteSync;
		PFNGLCLIENTWAITSYNCPROC ClientWaitSync;
		PFNGLWAITSYNCPROC WaitSync;
		PFNGLGETINTEGER64VPROC GetInteger64v;
		PFNGLGETSYNCIVPROC GetSynciv;
		PFNGLGETINTEGER64I_VPROC GetInteger64i_v;
		PFNGLGETBUFFERPARAMETERI64VPROC GetBufferParameteri64v;
		PFNGLGENSAMPLERSPROC GenSamplers;
		PFNGLDELETESAMPLERSPROC DeleteSamplers;
		PFNGLISSAMPLERPROC IsSampler;
		PFNGLBINDSAMPLERPROC BindSampler;
		PFNGLSAMPLERPARAMETERIPROC SamplerParameteri;
		PFNGLSAMPLERPARAMETERIVPROC SamplerParameteriv;
		PFNGLSAMPLERPARAMETERFPROC SamplerParameterf;
		PFNGLSAMPLERPARAMETERFVPROC SamplerParameterfv;
		PFNGLGETSAMPLERPARAMETERIVPROC GetSamplerParameteriv;
		PFNGLGETSAMPLERPARAMETERFVPROC GetSamplerParameterfv;
		PFNGLVERTEXATTRIBDIVISORPROC VertexAttribDivisor;
		PFNGLBINDTRANSFORMFEEDBACKPROC BindTransformFeedback;
		PFNGLDELETETRANSFORMFEEDBACKSPROC DeleteTransformFeedbacks;
		PFNGLGENTRANSFORMFEEDBACKSPROC GenTransformFeedbacks;
		PFNGLISTRANSFORMFEEDBACKPROC IsTransformFeedback;
		PFNGLPAUSETRANSFORMFEEDBACKPROC PauseTransformFeedback;
		PFNGLRESUMETRANSFORMFEEDBACKPROC ResumeTransformFeedback;
		PFNGLGETPROGRAMBINARYPROC GetProgramBinary;
		PFNGLPROGRAMBINARYPROC ProgramBinary;
		PFNGLPROGRAMPARAMETERIPROC ProgramParameteri;
		PFNGLINVALIDATEFRAMEBUFFERPROC InvalidateFramebuffer;
		PFNGLINVALIDATESUBFRAMEBUFFERPROC InvalidateSubFramebuffer;
		PFNGLTEXSTORAGE2DPROC TexStorage2D;
		PFNGLTEXSTORAGE3DPROC TexStorage3D;
		PFNGLGETINTERNALFORMATIVPROC GetInternalformativ;

		inline void VertexAttribIi(GLuint index, GLint x, GLint y, GLint z, GLint w) const { VertexAttribI4i(index, x, y, z, w);}
		inline void VertexAttribIui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) const { VertexAttribI4ui(index, x, y, z, w);}
		inline void Uniformui(GLint location, GLuint v0) const { Uniform1ui(location, v0);}
		inline void Uniformui(GLint location, GLuint v0, GLuint v1) const { Uniform2ui(location, v0, v1);}
		inline void Uniformui(GLint location, GLuint v0, GLuint v1, GLuint v2) const { Uniform3ui(location, v0, v1, v2);}
		inline void Uniformui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) const { Uniform4ui(location, v0, v1, v2, v3);}
	};

	class EsVersion31 : public EsVersion30
	{
	protected:

	private:
		bool Available;

	public:
		EsVersion31() = delete;
		EsVersion31(Func_GetProcAddress GetProcAddress);
		inline bool EsVersion31IsAvailable() { return Available; }


		PFNGLDISPATCHCOMPUTEPROC DispatchCompute;
		PFNGLDISPATCHCOMPUTEINDIRECTPROC DispatchComputeIndirect;
		PFNGLDRAWARRAYSINDIRECTPROC DrawArraysIndirect;
		PFNGLDRAWELEMENTSINDIRECTPROC DrawElementsIndirect;
		PFNGLFRAMEBUFFERPARAMETERIPROC FramebufferParameteri;
		PFNGLGETFRAMEBUFFERPARAMETERIVPROC GetFramebufferParameteriv;
		PFNGLGETPROGRAMINTERFACEIVPROC GetProgramInterfaceiv;
		PFNGLGETPROGRAMRESOURCEINDEXPROC GetProgramResourceIndex;
		PFNGLGETPROGRAMRESOURCENAMEPROC GetProgramResourceName;
		PFNGLGETPROGRAMRESOURCEIVPROC GetProgramResourceiv;
		PFNGLGETPROGRAMRESOURCELOCATIONPROC GetProgramResourceLocation;
		PFNGLUSEPROGRAMSTAGESPROC UseProgramStages;
		PFNGLACTIVESHADERPROGRAMPROC ActiveShaderProgram;
		PFNGLCREATESHADERPROGRAMVPROC CreateShaderProgramv;
		PFNGLBINDPROGRAMPIPELINEPROC BindProgramPipeline;
		PFNGLDELETEPROGRAMPIPELINESPROC DeleteProgramPipelines;
		PFNGLGENPROGRAMPIPELINESPROC GenProgramPipelines;
		PFNGLISPROGRAMPIPELINEPROC IsProgramPipeline;
		PFNGLGETPROGRAMPIPELINEIVPROC GetProgramPipelineiv;
		PFNGLPROGRAMUNIFORM1IPROC ProgramUniform1i;
		PFNGLPROGRAMUNIFORM2IPROC ProgramUniform2i;
		PFNGLPROGRAMUNIFORM3IPROC ProgramUniform3i;
		PFNGLPROGRAMUNIFORM4IPROC ProgramUniform4i;
		PFNGLPROGRAMUNIFORM1UIPROC ProgramUniform1ui;
		PFNGLPROGRAMUNIFORM2UIPROC ProgramUniform2ui;
		PFNGLPROGRAMUNIFORM3UIPROC ProgramUniform3ui;
		PFNGLPROGRAMUNIFORM4UIPROC ProgramUniform4ui;
		PFNGLPROGRAMUNIFORM1FPROC ProgramUniform1f;
		PFNGLPROGRAMUNIFORM2FPROC ProgramUniform2f;
		PFNGLPROGRAMUNIFORM3FPROC ProgramUniform3f;
		PFNGLPROGRAMUNIFORM4FPROC ProgramUniform4f;
		PFNGLPROGRAMUNIFORM1IVPROC ProgramUniform1iv;
		PFNGLPROGRAMUNIFORM2IVPROC ProgramUniform2iv;
		PFNGLPROGRAMUNIFORM3IVPROC ProgramUniform3iv;
		PFNGLPROGRAMUNIFORM4IVPROC ProgramUniform4iv;
		PFNGLPROGRAMUNIFORM1UIVPROC ProgramUniform1uiv;
		PFNGLPROGRAMUNIFORM2UIVPROC ProgramUniform2uiv;
		PFNGLPROGRAMUNIFORM3UIVPROC ProgramUniform3uiv;
		PFNGLPROGRAMUNIFORM4UIVPROC ProgramUniform4uiv;
		PFNGLPROGRAMUNIFORM1FVPROC ProgramUniform1fv;
		PFNGLPROGRAMUNIFORM2FVPROC ProgramUniform2fv;
		PFNGLPROGRAMUNIFORM3FVPROC ProgramUniform3fv;
		PFNGLPROGRAMUNIFORM4FVPROC ProgramUniform4fv;
		PFNGLPROGRAMUNIFORMMATRIX2FVPROC ProgramUniformMatrix2fv;
		PFNGLPROGRAMUNIFORMMATRIX3FVPROC ProgramUniformMatrix3fv;
		PFNGLPROGRAMUNIFORMMATRIX4FVPROC ProgramUniformMatrix4fv;
		PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC ProgramUniformMatrix2x3fv;
		PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC ProgramUniformMatrix3x2fv;
		PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC ProgramUniformMatrix2x4fv;
		PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC ProgramUniformMatrix4x2fv;
		PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC ProgramUniformMatrix3x4fv;
		PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC ProgramUniformMatrix4x3fv;
		PFNGLVALIDATEPROGRAMPIPELINEPROC ValidateProgramPipeline;
		PFNGLGETPROGRAMPIPELINEINFOLOGPROC GetProgramPipelineInfoLog;
		PFNGLBINDIMAGETEXTUREPROC BindImageTexture;
		PFNGLGETBOOLEANI_VPROC GetBooleani_v;
		PFNGLMEMORYBARRIERPROC MemoryBarrier;
		PFNGLMEMORYBARRIERBYREGIONPROC MemoryBarrierByRegion;
		PFNGLTEXSTORAGE2DMULTISAMPLEPROC TexStorage2DMultisample;
		PFNGLGETMULTISAMPLEFVPROC GetMultisamplefv;
		PFNGLSAMPLEMASKIPROC SampleMaski;
		PFNGLGETTEXLEVELPARAMETERIVPROC GetTexLevelParameteriv;
		PFNGLGETTEXLEVELPARAMETERFVPROC GetTexLevelParameterfv;
		PFNGLBINDVERTEXBUFFERPROC BindVertexBuffer;
		PFNGLVERTEXATTRIBFORMATPROC VertexAttribFormat;
		PFNGLVERTEXATTRIBIFORMATPROC VertexAttribIFormat;
		PFNGLVERTEXATTRIBBINDINGPROC VertexAttribBinding;
		PFNGLVERTEXBINDINGDIVISORPROC VertexBindingDivisor;

		inline void ProgramUniformi(GLuint program, GLint location, GLint v0) const { ProgramUniform1i(program, location, v0);}
		inline void ProgramUniformi(GLuint program, GLint location, GLint v0, GLint v1) const { ProgramUniform2i(program, location, v0, v1);}
		inline void ProgramUniformi(GLuint program, GLint location, GLint v0, GLint v1, GLint v2) const { ProgramUniform3i(program, location, v0, v1, v2);}
		inline void ProgramUniformi(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3) const { ProgramUniform4i(program, location, v0, v1, v2, v3);}
		inline void ProgramUniformui(GLuint program, GLint location, GLuint v0) const { ProgramUniform1ui(program, location, v0);}
		inline void ProgramUniformui(GLuint program, GLint location, GLuint v0, GLuint v1) const { ProgramUniform2ui(program, location, v0, v1);}
		inline void ProgramUniformui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2) const { ProgramUniform3ui(program, location, v0, v1, v2);}
		inline void ProgramUniformui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) const { ProgramUniform4ui(program, location, v0, v1, v2, v3);}
		inline void ProgramUniformf(GLuint program, GLint location, GLfloat v0) const { ProgramUniform1f(program, location, v0);}
		inline void ProgramUniformf(GLuint program, GLint location, GLfloat v0, GLfloat v1) const { ProgramUniform2f(program, location, v0, v1);}
		inline void ProgramUniformf(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) const { ProgramUniform3f(program, location, v0, v1, v2);}
		inline void ProgramUniformf(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) const { ProgramUniform4f(program, location, v0, v1, v2, v3);}
	};

	class EsVersion32 : public EsVersion31
	{
	protected:
		using PFNGLBLENDBARRIERPROC = void (APIENTRYP) (void);
		using PFNGLPRIMITIVEBOUNDINGBOXPROC = void (APIENTRYP) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);

	private:
		bool Available;

	public:
		EsVersion32() = delete;
		EsVersion32(Func_GetProcAddress GetProcAddress);
		inline bool EsVersion32IsAvailable() { return Available; }

		static constexpr GLenum MULTISAMPLE_LINE_WIDTH_RANGE = 0x9381;
		static constexpr GLenum MULTISAMPLE_LINE_WIDTH_GRANULARITY = 0x9382;
		static constexpr GLenum MULTIPLY = 0x9294;
		static constexpr GLenum SCREEN = 0x9295;
		static constexpr GLenum OVERLAY = 0x9296;
		static constexpr GLenum DARKEN = 0x9297;
		static constexpr GLenum LIGHTEN = 0x9298;
		static constexpr GLenum COLORDODGE = 0x9299;
		static constexpr GLenum COLORBURN = 0x929A;
		static constexpr GLenum HARDLIGHT = 0x929B;
		static constexpr GLenum SOFTLIGHT = 0x929C;
		static constexpr GLenum DIFFERENCE = 0x929E;
		static constexpr GLenum EXCLUSION = 0x92A0;
		static constexpr GLenum HSL_HUE = 0x92AD;
		static constexpr GLenum HSL_SATURATION = 0x92AE;
		static constexpr GLenum HSL_COLOR = 0x92AF;
		static constexpr GLenum HSL_LUMINOSITY = 0x92B0;
		static constexpr GLenum PRIMITIVE_BOUNDING_BOX = 0x92BE;
		static constexpr GLenum COMPRESSED_RGBA_ASTC_4x4 = 0x93B0;
		static constexpr GLenum COMPRESSED_RGBA_ASTC_5x4 = 0x93B1;
		static constexpr GLenum COMPRESSED_RGBA_ASTC_5x5 = 0x93B2;
		static constexpr GLenum COMPRESSED_RGBA_ASTC_6x5 = 0x93B3;
		static constexpr GLenum COMPRESSED_RGBA_ASTC_6x6 = 0x93B4;
		static constexpr GLenum COMPRESSED_RGBA_ASTC_8x5 = 0x93B5;
		static constexpr GLenum COMPRESSED_RGBA_ASTC_8x6 = 0x93B6;
		static constexpr GLenum COMPRESSED_RGBA_ASTC_8x8 = 0x93B7;
		static constexpr GLenum COMPRESSED_RGBA_ASTC_10x5 = 0x93B8;
		static constexpr GLenum COMPRESSED_RGBA_ASTC_10x6 = 0x93B9;
		static constexpr GLenum COMPRESSED_RGBA_ASTC_10x8 = 0x93BA;
		static constexpr GLenum COMPRESSED_RGBA_ASTC_10x10 = 0x93BB;
		static constexpr GLenum COMPRESSED_RGBA_ASTC_12x10 = 0x93BC;
		static constexpr GLenum COMPRESSED_RGBA_ASTC_12x12 = 0x93BD;
		static constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_4x4 = 0x93D0;
		static constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_5x4 = 0x93D1;
		static constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_5x5 = 0x93D2;
		static constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_6x5 = 0x93D3;
		static constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_6x6 = 0x93D4;
		static constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_8x5 = 0x93D5;
		static constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_8x6 = 0x93D6;
		static constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_8x8 = 0x93D7;
		static constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_10x5 = 0x93D8;
		static constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_10x6 = 0x93D9;
		static constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_10x8 = 0x93DA;
		static constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_10x10 = 0x93DB;
		static constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_12x10 = 0x93DC;
		static constexpr GLenum COMPRESSED_SRGB8_ALPHA8_ASTC_12x12 = 0x93DD;

		PFNGLBLENDBARRIERPROC BlendBarrier;
		PFNGLCOPYIMAGESUBDATAPROC CopyImageSubData;
		PFNGLDEBUGMESSAGECONTROLPROC DebugMessageControl;
		PFNGLDEBUGMESSAGEINSERTPROC DebugMessageInsert;
		PFNGLDEBUGMESSAGECALLBACKPROC DebugMessageCallback;
		PFNGLGETDEBUGMESSAGELOGPROC GetDebugMessageLog;
		PFNGLPUSHDEBUGGROUPPROC PushDebugGroup;
		PFNGLPOPDEBUGGROUPPROC PopDebugGroup;
		PFNGLOBJECTLABELPROC ObjectLabel;
		PFNGLGETOBJECTLABELPROC GetObjectLabel;
		PFNGLOBJECTPTRLABELPROC ObjectPtrLabel;
		PFNGLGETOBJECTPTRLABELPROC GetObjectPtrLabel;
		PFNGLGETPOINTERVPROC GetPointerv;
		PFNGLENABLEIPROC Enablei;
		PFNGLDISABLEIPROC Disablei;
		PFNGLBLENDEQUATIONIPROC BlendEquationi;
		PFNGLBLENDEQUATIONSEPARATEIPROC BlendEquationSeparatei;
		PFNGLBLENDFUNCIPROC BlendFunci;
		PFNGLBLENDFUNCSEPARATEIPROC BlendFuncSeparatei;
		PFNGLCOLORMASKIPROC ColorMaski;
		PFNGLISENABLEDIPROC IsEnabledi;
		PFNGLDRAWELEMENTSBASEVERTEXPROC DrawElementsBaseVertex;
		PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC DrawRangeElementsBaseVertex;
		PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC DrawElementsInstancedBaseVertex;
		PFNGLFRAMEBUFFERTEXTUREPROC FramebufferTexture;
		PFNGLPRIMITIVEBOUNDINGBOXPROC PrimitiveBoundingBox;
		PFNGLGETGRAPHICSRESETSTATUSPROC GetGraphicsResetStatus;
		PFNGLREADNPIXELSPROC ReadnPixels;
		PFNGLGETNUNIFORMFVPROC GetnUniformfv;
		PFNGLGETNUNIFORMIVPROC GetnUniformiv;
		PFNGLGETNUNIFORMUIVPROC GetnUniformuiv;
		PFNGLMINSAMPLESHADINGPROC MinSampleShading;
		PFNGLPATCHPARAMETERIPROC PatchParameteri;
		PFNGLTEXPARAMETERIIVPROC TexParameterIiv;
		PFNGLTEXPARAMETERIUIVPROC TexParameterIuiv;
		PFNGLGETTEXPARAMETERIIVPROC GetTexParameterIiv;
		PFNGLGETTEXPARAMETERIUIVPROC GetTexParameterIuiv;
		PFNGLSAMPLERPARAMETERIIVPROC SamplerParameterIiv;
		PFNGLSAMPLERPARAMETERIUIVPROC SamplerParameterIuiv;
		PFNGLGETSAMPLERPARAMETERIIVPROC GetSamplerParameterIiv;
		PFNGLGETSAMPLERPARAMETERIUIVPROC GetSamplerParameterIuiv;
		PFNGLTEXBUFFERPROC TexBuffer;
		PFNGLTEXBUFFERRANGEPROC TexBufferRange;
		PFNGLTEXSTORAGE3DMULTISAMPLEPROC TexStorage3DMultisample;

	};
};
